letta-nightly 0.8.16.dev20250721070720__tar.gz → 0.8.17.dev20250721222456__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 (421) hide show
  1. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/PKG-INFO +1 -1
  2. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/__init__.py +1 -1
  3. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/letta_message.py +3 -3
  4. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/message.py +9 -0
  5. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/db.py +34 -9
  6. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/streaming_response.py +1 -8
  7. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/utils.py +4 -4
  8. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/agent_file_manager.py +113 -44
  9. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/source_manager.py +117 -0
  10. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/tool_executor/builtin_tool_executor.py +13 -5
  11. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/tool_manager.py +50 -0
  12. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/settings.py +1 -0
  13. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/pyproject.toml +1 -1
  14. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/LICENSE +0 -0
  15. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/README.md +0 -0
  16. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/agent.py +0 -0
  17. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/agents/__init__.py +0 -0
  18. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/agents/base_agent.py +0 -0
  19. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/agents/ephemeral_agent.py +0 -0
  20. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/agents/ephemeral_summary_agent.py +0 -0
  21. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/agents/exceptions.py +0 -0
  22. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/agents/helpers.py +0 -0
  23. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/agents/letta_agent.py +0 -0
  24. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/agents/letta_agent_batch.py +0 -0
  25. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/agents/voice_agent.py +0 -0
  26. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/agents/voice_sleeptime_agent.py +0 -0
  27. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/cli/cli.py +0 -0
  28. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/cli/cli_load.py +0 -0
  29. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/client/__init__.py +0 -0
  30. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/client/client.py +0 -0
  31. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/client/streaming.py +0 -0
  32. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/client/utils.py +0 -0
  33. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/config.py +0 -0
  34. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/constants.py +0 -0
  35. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/data_sources/__init__.py +0 -0
  36. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/data_sources/connectors.py +0 -0
  37. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/data_sources/connectors_helper.py +0 -0
  38. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/data_sources/redis_client.py +0 -0
  39. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/embeddings.py +0 -0
  40. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/errors.py +0 -0
  41. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/__init__.py +0 -0
  42. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/ast_parsers.py +0 -0
  43. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/async_composio_toolset.py +0 -0
  44. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/composio_helpers.py +0 -0
  45. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/function_sets/base.py +0 -0
  46. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/function_sets/builtin.py +0 -0
  47. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/function_sets/extras.py +0 -0
  48. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/function_sets/files.py +0 -0
  49. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/function_sets/multi_agent.py +0 -0
  50. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/function_sets/voice.py +0 -0
  51. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/functions.py +0 -0
  52. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/helpers.py +0 -0
  53. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/interface.py +0 -0
  54. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/mcp_client/__init__.py +0 -0
  55. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/mcp_client/base_client.py +0 -0
  56. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/mcp_client/exceptions.py +0 -0
  57. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/mcp_client/sse_client.py +0 -0
  58. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/mcp_client/stdio_client.py +0 -0
  59. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/mcp_client/types.py +0 -0
  60. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/prompts.py +0 -0
  61. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/schema_generator.py +0 -0
  62. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/functions/types.py +0 -0
  63. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/groups/dynamic_multi_agent.py +0 -0
  64. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/groups/helpers.py +0 -0
  65. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/groups/round_robin_multi_agent.py +0 -0
  66. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/groups/sleeptime_multi_agent.py +0 -0
  67. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/groups/sleeptime_multi_agent_v2.py +0 -0
  68. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/groups/supervisor_multi_agent.py +0 -0
  69. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/helpers/__init__.py +0 -0
  70. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/helpers/composio_helpers.py +0 -0
  71. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/helpers/converters.py +0 -0
  72. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/helpers/datetime_helpers.py +0 -0
  73. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/helpers/decorators.py +0 -0
  74. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/helpers/json_helpers.py +0 -0
  75. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/helpers/message_helper.py +0 -0
  76. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/helpers/pinecone_utils.py +0 -0
  77. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/helpers/singleton.py +0 -0
  78. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/helpers/tool_execution_helper.py +0 -0
  79. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/helpers/tool_rule_solver.py +0 -0
  80. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/humans/__init__.py +0 -0
  81. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/humans/examples/basic.txt +0 -0
  82. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/humans/examples/cs_phd.txt +0 -0
  83. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/interface.py +0 -0
  84. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/interfaces/__init__.py +0 -0
  85. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/interfaces/anthropic_streaming_interface.py +0 -0
  86. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/interfaces/openai_chat_completions_streaming_interface.py +0 -0
  87. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/interfaces/openai_streaming_interface.py +0 -0
  88. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/interfaces/utils.py +0 -0
  89. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/jobs/__init__.py +0 -0
  90. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/jobs/helpers.py +0 -0
  91. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/jobs/llm_batch_job_polling.py +0 -0
  92. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/jobs/scheduler.py +0 -0
  93. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/jobs/types.py +0 -0
  94. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/__init__.py +0 -0
  95. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/anthropic.py +0 -0
  96. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/anthropic_client.py +0 -0
  97. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/aws_bedrock.py +0 -0
  98. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/azure_openai.py +0 -0
  99. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/azure_openai_constants.py +0 -0
  100. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/bedrock_client.py +0 -0
  101. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/cohere.py +0 -0
  102. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/deepseek.py +0 -0
  103. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/google_ai_client.py +0 -0
  104. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/google_constants.py +0 -0
  105. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/google_vertex_client.py +0 -0
  106. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/helpers.py +0 -0
  107. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/llm_api_tools.py +0 -0
  108. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/llm_client.py +0 -0
  109. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/llm_client_base.py +0 -0
  110. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/mistral.py +0 -0
  111. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/openai.py +0 -0
  112. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/llm_api/openai_client.py +0 -0
  113. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/README.md +0 -0
  114. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/__init__.py +0 -0
  115. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/chat_completion_proxy.py +0 -0
  116. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/constants.py +0 -0
  117. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/function_parser.py +0 -0
  118. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/grammars/__init__.py +0 -0
  119. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/grammars/gbnf_grammar_generator.py +0 -0
  120. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/grammars/json.gbnf +0 -0
  121. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/grammars/json_func_calls_with_inner_thoughts.gbnf +0 -0
  122. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/json_parser.py +0 -0
  123. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/koboldcpp/api.py +0 -0
  124. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/koboldcpp/settings.py +0 -0
  125. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/llamacpp/api.py +0 -0
  126. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/llamacpp/settings.py +0 -0
  127. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/llm_chat_completion_wrappers/__init__.py +0 -0
  128. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/llm_chat_completion_wrappers/airoboros.py +0 -0
  129. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/llm_chat_completion_wrappers/chatml.py +0 -0
  130. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py +0 -0
  131. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/llm_chat_completion_wrappers/dolphin.py +0 -0
  132. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/llm_chat_completion_wrappers/llama3.py +0 -0
  133. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/llm_chat_completion_wrappers/simple_summary_wrapper.py +0 -0
  134. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/llm_chat_completion_wrappers/wrapper_base.py +0 -0
  135. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/llm_chat_completion_wrappers/zephyr.py +0 -0
  136. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/lmstudio/api.py +0 -0
  137. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/lmstudio/settings.py +0 -0
  138. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/ollama/api.py +0 -0
  139. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/ollama/settings.py +0 -0
  140. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/settings/__init__.py +0 -0
  141. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/settings/deterministic_mirostat.py +0 -0
  142. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/settings/settings.py +0 -0
  143. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/settings/simple.py +0 -0
  144. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/utils.py +0 -0
  145. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/vllm/api.py +0 -0
  146. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/webui/api.py +0 -0
  147. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/webui/legacy_api.py +0 -0
  148. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/webui/legacy_settings.py +0 -0
  149. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/local_llm/webui/settings.py +0 -0
  150. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/log.py +0 -0
  151. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/main.py +0 -0
  152. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/memory.py +0 -0
  153. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/openai_backcompat/__init__.py +0 -0
  154. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/openai_backcompat/openai_object.py +0 -0
  155. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/__all__.py +0 -0
  156. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/__init__.py +0 -0
  157. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/agent.py +0 -0
  158. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/agents_tags.py +0 -0
  159. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/base.py +0 -0
  160. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/block.py +0 -0
  161. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/block_history.py +0 -0
  162. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/blocks_agents.py +0 -0
  163. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/custom_columns.py +0 -0
  164. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/enums.py +0 -0
  165. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/errors.py +0 -0
  166. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/file.py +0 -0
  167. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/files_agents.py +0 -0
  168. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/group.py +0 -0
  169. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/groups_agents.py +0 -0
  170. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/groups_blocks.py +0 -0
  171. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/identities_agents.py +0 -0
  172. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/identities_blocks.py +0 -0
  173. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/identity.py +0 -0
  174. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/job.py +0 -0
  175. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/job_messages.py +0 -0
  176. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/llm_batch_items.py +0 -0
  177. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/llm_batch_job.py +0 -0
  178. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/mcp_server.py +0 -0
  179. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/message.py +0 -0
  180. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/mixins.py +0 -0
  181. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/organization.py +0 -0
  182. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/passage.py +0 -0
  183. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/provider.py +0 -0
  184. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/provider_trace.py +0 -0
  185. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/sandbox_config.py +0 -0
  186. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/source.py +0 -0
  187. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/sources_agents.py +0 -0
  188. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/sqlalchemy_base.py +0 -0
  189. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/sqlite_functions.py +0 -0
  190. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/step.py +0 -0
  191. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/tool.py +0 -0
  192. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/tools_agents.py +0 -0
  193. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/orm/user.py +0 -0
  194. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/otel/__init__.py +0 -0
  195. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/otel/context.py +0 -0
  196. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/otel/db_pool_monitoring.py +0 -0
  197. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/otel/events.py +0 -0
  198. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/otel/metric_registry.py +0 -0
  199. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/otel/metrics.py +0 -0
  200. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/otel/resource.py +0 -0
  201. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/otel/sqlalchemy_instrumentation.py +0 -0
  202. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/otel/sqlalchemy_instrumentation_integration.py +0 -0
  203. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/otel/tracing.py +0 -0
  204. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/personas/__init__.py +0 -0
  205. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/personas/examples/anna_pa.txt +0 -0
  206. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/personas/examples/google_search_persona.txt +0 -0
  207. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/personas/examples/memgpt_doc.txt +0 -0
  208. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/personas/examples/memgpt_starter.txt +0 -0
  209. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/personas/examples/o1_persona.txt +0 -0
  210. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/personas/examples/sam.txt +0 -0
  211. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/personas/examples/sam_pov.txt +0 -0
  212. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/personas/examples/sam_simple_pov_gpt35.txt +0 -0
  213. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/personas/examples/sleeptime_doc_persona.txt +0 -0
  214. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/personas/examples/sleeptime_memory_persona.txt +0 -0
  215. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/personas/examples/sqldb/test.db +0 -0
  216. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/personas/examples/voice_memory_persona.txt +0 -0
  217. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/plugins/README.md +0 -0
  218. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/plugins/__init__.py +0 -0
  219. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/plugins/defaults.py +0 -0
  220. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/plugins/plugins.py +0 -0
  221. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/__init__.py +0 -0
  222. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/gpt_summarize.py +0 -0
  223. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/gpt_system.py +0 -0
  224. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/memgpt_base.txt +0 -0
  225. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/memgpt_chat.txt +0 -0
  226. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/memgpt_chat_compressed.txt +0 -0
  227. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/memgpt_chat_fstring.txt +0 -0
  228. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/memgpt_convo_only.txt +0 -0
  229. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/memgpt_doc.txt +0 -0
  230. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/memgpt_gpt35_extralong.txt +0 -0
  231. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/memgpt_intuitive_knowledge.txt +0 -0
  232. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/memgpt_memory_only.txt +0 -0
  233. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/memgpt_modified_chat.txt +0 -0
  234. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/memgpt_modified_o1.txt +0 -0
  235. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/memgpt_offline_memory.txt +0 -0
  236. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/memgpt_offline_memory_chat.txt +0 -0
  237. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/memgpt_sleeptime_chat.txt +0 -0
  238. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/memgpt_v2_chat.txt +0 -0
  239. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/react.txt +0 -0
  240. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/sleeptime.txt +0 -0
  241. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/sleeptime_doc_ingest.txt +0 -0
  242. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/sleeptime_v2.txt +0 -0
  243. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/summary_system_prompt.txt +0 -0
  244. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/voice_chat.txt +0 -0
  245. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/voice_sleeptime.txt +0 -0
  246. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/prompts/system/workflow.txt +0 -0
  247. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/pytest.ini +0 -0
  248. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/agent.py +0 -0
  249. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/agent_file.py +0 -0
  250. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/block.py +0 -0
  251. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/embedding_config.py +0 -0
  252. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/embedding_config_overrides.py +0 -0
  253. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/enums.py +0 -0
  254. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/environment_variables.py +0 -0
  255. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/file.py +0 -0
  256. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/group.py +0 -0
  257. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/health.py +0 -0
  258. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/identity.py +0 -0
  259. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/job.py +0 -0
  260. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/letta_base.py +0 -0
  261. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/letta_message_content.py +0 -0
  262. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/letta_request.py +0 -0
  263. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/letta_response.py +0 -0
  264. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/letta_stop_reason.py +0 -0
  265. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/llm_batch_job.py +0 -0
  266. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/llm_config.py +0 -0
  267. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/llm_config_overrides.py +0 -0
  268. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/mcp.py +0 -0
  269. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/memory.py +0 -0
  270. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/openai/chat_completion_request.py +0 -0
  271. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/openai/chat_completion_response.py +0 -0
  272. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/openai/chat_completions.py +0 -0
  273. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/openai/embedding_response.py +0 -0
  274. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/openai/openai.py +0 -0
  275. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/organization.py +0 -0
  276. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/passage.py +0 -0
  277. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/pip_requirement.py +0 -0
  278. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/provider_trace.py +0 -0
  279. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/providers.py +0 -0
  280. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/response_format.py +0 -0
  281. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/run.py +0 -0
  282. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/sandbox_config.py +0 -0
  283. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/source.py +0 -0
  284. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/source_metadata.py +0 -0
  285. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/step.py +0 -0
  286. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/tool.py +0 -0
  287. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/tool_execution_result.py +0 -0
  288. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/tool_rule.py +0 -0
  289. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/usage.py +0 -0
  290. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/schemas/user.py +0 -0
  291. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/serialize_schemas/__init__.py +0 -0
  292. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/serialize_schemas/marshmallow_agent.py +0 -0
  293. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/serialize_schemas/marshmallow_agent_environment_variable.py +0 -0
  294. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/serialize_schemas/marshmallow_base.py +0 -0
  295. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/serialize_schemas/marshmallow_block.py +0 -0
  296. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/serialize_schemas/marshmallow_custom_fields.py +0 -0
  297. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/serialize_schemas/marshmallow_message.py +0 -0
  298. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/serialize_schemas/marshmallow_tag.py +0 -0
  299. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/serialize_schemas/marshmallow_tool.py +0 -0
  300. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/serialize_schemas/pydantic_agent_schema.py +0 -0
  301. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/__init__.py +0 -0
  302. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/constants.py +0 -0
  303. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/generate_openapi_schema.sh +0 -0
  304. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/__init__.py +0 -0
  305. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/app.py +0 -0
  306. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/auth/__init__.py +0 -0
  307. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/auth/index.py +0 -0
  308. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/auth_token.py +0 -0
  309. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/chat_completions_interface.py +0 -0
  310. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/interface.py +0 -0
  311. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/json_parser.py +0 -0
  312. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/__init__.py +0 -0
  313. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/openai/chat_completions/__init__.py +0 -0
  314. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +0 -0
  315. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/__init__.py +0 -0
  316. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/agents.py +0 -0
  317. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/blocks.py +0 -0
  318. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/embeddings.py +0 -0
  319. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/groups.py +0 -0
  320. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/health.py +0 -0
  321. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/identities.py +0 -0
  322. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/jobs.py +0 -0
  323. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/llms.py +0 -0
  324. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/messages.py +0 -0
  325. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/organizations.py +0 -0
  326. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/providers.py +0 -0
  327. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/runs.py +0 -0
  328. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/sandbox_configs.py +0 -0
  329. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/sources.py +0 -0
  330. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/steps.py +0 -0
  331. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/tags.py +0 -0
  332. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/telemetry.py +0 -0
  333. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/tools.py +0 -0
  334. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/users.py +0 -0
  335. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/routers/v1/voice.py +0 -0
  336. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/rest_api/static_files.py +0 -0
  337. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/server.py +0 -0
  338. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/startup.sh +0 -0
  339. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/static_files/assets/index-048c9598.js +0 -0
  340. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/static_files/assets/index-0e31b727.css +0 -0
  341. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/static_files/favicon.ico +0 -0
  342. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/static_files/index.html +0 -0
  343. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/static_files/memgpt_logo_transparent.png +0 -0
  344. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/utils.py +0 -0
  345. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/ws_api/__init__.py +0 -0
  346. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/ws_api/example_client.py +0 -0
  347. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/ws_api/interface.py +0 -0
  348. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/ws_api/protocol.py +0 -0
  349. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/server/ws_api/server.py +0 -0
  350. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/__init__.py +0 -0
  351. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/agent_manager.py +0 -0
  352. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/block_manager.py +0 -0
  353. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/context_window_calculator/__init__.py +0 -0
  354. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/context_window_calculator/context_window_calculator.py +0 -0
  355. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/context_window_calculator/token_counter.py +0 -0
  356. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/file_manager.py +0 -0
  357. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/file_processor/__init__.py +0 -0
  358. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/file_processor/chunker/__init__.py +0 -0
  359. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/file_processor/chunker/line_chunker.py +0 -0
  360. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/file_processor/chunker/llama_index_chunker.py +0 -0
  361. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/file_processor/embedder/__init__.py +0 -0
  362. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/file_processor/embedder/base_embedder.py +0 -0
  363. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/file_processor/embedder/openai_embedder.py +0 -0
  364. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/file_processor/embedder/pinecone_embedder.py +0 -0
  365. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/file_processor/file_processor.py +0 -0
  366. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/file_processor/file_types.py +0 -0
  367. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/file_processor/parser/__init__.py +0 -0
  368. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/file_processor/parser/base_parser.py +0 -0
  369. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/file_processor/parser/mistral_parser.py +0 -0
  370. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/file_processor/types.py +0 -0
  371. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/files_agents_manager.py +0 -0
  372. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/group_manager.py +0 -0
  373. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/helpers/agent_manager_helper.py +0 -0
  374. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/helpers/tool_execution_helper.py +0 -0
  375. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/helpers/tool_parser_helper.py +0 -0
  376. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/identity_manager.py +0 -0
  377. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/job_manager.py +0 -0
  378. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/llm_batch_manager.py +0 -0
  379. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/mcp/__init__.py +0 -0
  380. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/mcp/base_client.py +0 -0
  381. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/mcp/sse_client.py +0 -0
  382. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/mcp/stdio_client.py +0 -0
  383. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/mcp/streamable_http_client.py +0 -0
  384. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/mcp/types.py +0 -0
  385. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/mcp_manager.py +0 -0
  386. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/message_manager.py +0 -0
  387. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/organization_manager.py +0 -0
  388. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/passage_manager.py +0 -0
  389. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/per_agent_lock_manager.py +0 -0
  390. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/provider_manager.py +0 -0
  391. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/sandbox_config_manager.py +0 -0
  392. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/step_manager.py +0 -0
  393. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/summarizer/__init__.py +0 -0
  394. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/summarizer/enums.py +0 -0
  395. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/summarizer/summarizer.py +0 -0
  396. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/telemetry_manager.py +0 -0
  397. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/tool_executor/__init__.py +0 -0
  398. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/tool_executor/composio_tool_executor.py +0 -0
  399. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/tool_executor/core_tool_executor.py +0 -0
  400. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/tool_executor/files_tool_executor.py +0 -0
  401. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/tool_executor/mcp_tool_executor.py +0 -0
  402. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/tool_executor/multi_agent_tool_executor.py +0 -0
  403. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/tool_executor/tool_execution_manager.py +0 -0
  404. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/tool_executor/tool_execution_sandbox.py +0 -0
  405. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/tool_executor/tool_executor.py +0 -0
  406. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/tool_executor/tool_executor_base.py +0 -0
  407. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/tool_sandbox/__init__.py +0 -0
  408. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/tool_sandbox/base.py +0 -0
  409. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/tool_sandbox/e2b_sandbox.py +0 -0
  410. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/tool_sandbox/local_sandbox.py +0 -0
  411. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/services/user_manager.py +0 -0
  412. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/streaming_interface.py +0 -0
  413. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/streaming_utils.py +0 -0
  414. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/system.py +0 -0
  415. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/templates/__init__.py +0 -0
  416. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/templates/sandbox_code_file.py.j2 +0 -0
  417. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/templates/sandbox_code_file_async.py.j2 +0 -0
  418. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/templates/summary_request_text.j2 +0 -0
  419. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/templates/template_helper.py +0 -0
  420. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/types/__init__.py +0 -0
  421. {letta_nightly-0.8.16.dev20250721070720 → letta_nightly-0.8.17.dev20250721222456}/letta/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: letta-nightly
3
- Version: 0.8.16.dev20250721070720
3
+ Version: 0.8.17.dev20250721222456
4
4
  Summary: Create LLM agents with long-term memory and custom tools
5
5
  License: Apache License
6
6
  Author: Letta Team
@@ -5,7 +5,7 @@ try:
5
5
  __version__ = version("letta")
6
6
  except PackageNotFoundError:
7
7
  # Fallback for development installations
8
- __version__ = "0.8.16"
8
+ __version__ = "0.8.17"
9
9
 
10
10
  if os.environ.get("LETTA_VERSION"):
11
11
  __version__ = os.environ["LETTA_VERSION"]
@@ -63,13 +63,13 @@ class LettaMessage(BaseModel):
63
63
  dt = dt.replace(tzinfo=timezone.utc)
64
64
  return dt.isoformat(timespec="seconds")
65
65
 
66
- @field_serializer("is_err", when_used="unless-none")
67
- def serialize_is_err(self, value: bool | None, _info):
66
+ @field_serializer("is_err", mode="wrap")
67
+ def serialize_is_err(self, value: bool | None, handler, _info):
68
68
  """
69
69
  Only serialize is_err field when it's True (for debugging purposes).
70
70
  When is_err is None or False, this field will be excluded from the JSON output.
71
71
  """
72
- return value if value is True else None
72
+ return handler(value) if value is True else None
73
73
 
74
74
 
75
75
  class SystemMessage(LettaMessage):
@@ -269,6 +269,7 @@ class Message(BaseMessage):
269
269
  otid=otid,
270
270
  sender_id=self.sender_id,
271
271
  step_id=self.step_id,
272
+ is_err=self.is_err,
272
273
  )
273
274
  )
274
275
  # Otherwise, we may have a list of multiple types
@@ -287,6 +288,7 @@ class Message(BaseMessage):
287
288
  otid=otid,
288
289
  sender_id=self.sender_id,
289
290
  step_id=self.step_id,
291
+ is_err=self.is_err,
290
292
  )
291
293
  )
292
294
  elif isinstance(content_part, ReasoningContent):
@@ -301,6 +303,7 @@ class Message(BaseMessage):
301
303
  name=self.name,
302
304
  otid=otid,
303
305
  step_id=self.step_id,
306
+ is_err=self.is_err,
304
307
  )
305
308
  )
306
309
  elif isinstance(content_part, RedactedReasoningContent):
@@ -315,6 +318,7 @@ class Message(BaseMessage):
315
318
  otid=otid,
316
319
  sender_id=self.sender_id,
317
320
  step_id=self.step_id,
321
+ is_err=self.is_err,
318
322
  )
319
323
  )
320
324
  elif isinstance(content_part, OmittedReasoningContent):
@@ -328,6 +332,7 @@ class Message(BaseMessage):
328
332
  name=self.name,
329
333
  otid=otid,
330
334
  step_id=self.step_id,
335
+ is_err=self.is_err,
331
336
  )
332
337
  )
333
338
  else:
@@ -355,6 +360,7 @@ class Message(BaseMessage):
355
360
  otid=otid,
356
361
  sender_id=self.sender_id,
357
362
  step_id=self.step_id,
363
+ is_err=self.is_err,
358
364
  )
359
365
  )
360
366
  else:
@@ -371,6 +377,7 @@ class Message(BaseMessage):
371
377
  otid=otid,
372
378
  sender_id=self.sender_id,
373
379
  step_id=self.step_id,
380
+ is_err=self.is_err,
374
381
  )
375
382
  )
376
383
  elif self.role == MessageRole.tool:
@@ -416,6 +423,7 @@ class Message(BaseMessage):
416
423
  otid=Message.generate_otid_from_id(self.id, len(messages)),
417
424
  sender_id=self.sender_id,
418
425
  step_id=self.step_id,
426
+ is_err=self.is_err,
419
427
  )
420
428
  )
421
429
  elif self.role == MessageRole.user:
@@ -437,6 +445,7 @@ class Message(BaseMessage):
437
445
  otid=self.otid,
438
446
  sender_id=self.sender_id,
439
447
  step_id=self.step_id,
448
+ is_err=self.is_err,
440
449
  )
441
450
  )
442
451
  elif self.role == MessageRole.system:
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  import os
2
3
  import threading
3
4
  import time
@@ -116,6 +117,13 @@ class DatabaseRegistry:
116
117
  self.config = LettaConfig.load()
117
118
  self.logger = get_logger(__name__)
118
119
 
120
+ if settings.db_max_concurrent_sessions:
121
+ self._db_semaphore = asyncio.Semaphore(settings.db_max_concurrent_sessions)
122
+ self.logger.info(f"Initialized database throttling with max {settings.db_max_concurrent_sessions} concurrent sessions")
123
+ else:
124
+ self.logger.info("Database throttling is disabled")
125
+ self._db_semaphore = None
126
+
119
127
  def initialize_sync(self, force: bool = False) -> None:
120
128
  """Initialize the synchronous database engine if not already initialized."""
121
129
  with self._lock:
@@ -364,16 +372,33 @@ class DatabaseRegistry:
364
372
  @trace_method
365
373
  @asynccontextmanager
366
374
  async def async_session(self, name: str = "default") -> AsyncGenerator[AsyncSession, None]:
367
- """Async context manager for database sessions."""
368
- session_factory = self.get_async_session_factory(name)
369
- if not session_factory:
370
- raise ValueError(f"No async session factory found for '{name}' or async database is not configured")
375
+ """Async context manager for database sessions with throttling."""
376
+ if self._db_semaphore:
377
+ async with self._db_semaphore:
378
+ session_factory = self.get_async_session_factory(name)
379
+ if not session_factory:
380
+ raise ValueError(f"No async session factory found for '{name}' or async database is not configured")
381
+
382
+ session = session_factory()
383
+ try:
384
+ yield session
385
+ finally:
386
+ await session.close()
387
+ else:
388
+ session_factory = self.get_async_session_factory(name)
389
+ if not session_factory:
390
+ raise ValueError(f"No async session factory found for '{name}' or async database is not configured")
371
391
 
372
- session = session_factory()
373
- try:
374
- yield session
375
- finally:
376
- await session.close()
392
+ session = session_factory()
393
+ try:
394
+ yield session
395
+ finally:
396
+ await session.close()
397
+
398
+ @trace_method
399
+ def session_caller_trace(self, caller_info: str):
400
+ """Trace sync db caller information for debugging purposes."""
401
+ pass # wrapper used for otel tracing only
377
402
 
378
403
  @trace_method
379
404
  def session_caller_trace(self, caller_info: str):
@@ -125,14 +125,7 @@ class StreamingResponseWithStatusCode(StreamingResponse):
125
125
  if not isinstance(content, bytes):
126
126
  content = content.encode(self.charset)
127
127
  more_body = False
128
- await send(
129
- {
130
- "type": "http.response.body",
131
- "body": content,
132
- "more_body": more_body,
133
- }
134
- )
135
- raise Exception(f"An exception occurred mid-stream with status code {status_code}", detail={"content": content})
128
+ raise Exception(f"An exception occurred mid-stream with status code {status_code} with content {content}")
136
129
  else:
137
130
  content = chunk
138
131
 
@@ -120,22 +120,22 @@ async def sse_async_generator(
120
120
  yield sse_formatter(usage.model_dump(exclude={"steps_messages"}))
121
121
 
122
122
  except ContextWindowExceededError as e:
123
- log_error_to_sentry(e)
123
+ capture_sentry_exception(e)
124
124
  logger.error(f"ContextWindowExceededError error: {e}")
125
125
  yield sse_formatter({"error": f"Stream failed: {e}", "code": str(e.code.value) if e.code else None})
126
126
 
127
127
  except RateLimitExceededError as e:
128
- log_error_to_sentry(e)
128
+ capture_sentry_exception(e)
129
129
  logger.error(f"RateLimitExceededError error: {e}")
130
130
  yield sse_formatter({"error": f"Stream failed: {e}", "code": str(e.code.value) if e.code else None})
131
131
 
132
132
  except Exception as e:
133
- log_error_to_sentry(e)
133
+ capture_sentry_exception(e)
134
134
  logger.error(f"Caught unexpected Exception: {e}")
135
135
  yield sse_formatter({"error": "Stream failed (internal error occurred)"})
136
136
 
137
137
  except Exception as e:
138
- log_error_to_sentry(e)
138
+ capture_sentry_exception(e)
139
139
  logger.error(f"Caught unexpected Exception: {e}")
140
140
  yield sse_formatter({"error": "Stream failed (decoder encountered an error)"})
141
141
 
@@ -149,7 +149,7 @@ class AgentFileManager:
149
149
  return sorted(unique_blocks.values(), key=lambda x: x.label)
150
150
 
151
151
  async def _extract_unique_sources_and_files_from_agents(
152
- self, agent_states: List[AgentState], actor: User
152
+ self, agent_states: List[AgentState], actor: User, files_agents_cache: dict = None
153
153
  ) -> tuple[List[Source], List[FileMetadata]]:
154
154
  """Extract unique sources and files from agent states using bulk operations"""
155
155
 
@@ -160,6 +160,10 @@ class AgentFileManager:
160
160
  files_agents = await self.file_agent_manager.list_files_for_agent(
161
161
  agent_id=agent_state.id, actor=actor, is_open_only=False, return_as_blocks=False
162
162
  )
163
+ # cache the results for reuse during conversion
164
+ if files_agents_cache is not None:
165
+ files_agents_cache[agent_state.id] = files_agents
166
+
163
167
  for file_agent in files_agents:
164
168
  all_source_ids.add(file_agent.source_id)
165
169
  all_file_ids.add(file_agent.file_id)
@@ -168,13 +172,18 @@ class AgentFileManager:
168
172
 
169
173
  return sources, files
170
174
 
171
- async def _convert_agent_state_to_schema(self, agent_state: AgentState, actor: User) -> AgentSchema:
175
+ async def _convert_agent_state_to_schema(self, agent_state: AgentState, actor: User, files_agents_cache: dict = None) -> AgentSchema:
172
176
  """Convert AgentState to AgentSchema with ID remapping"""
173
177
 
174
178
  agent_file_id = self._map_db_to_file_id(agent_state.id, AgentSchema.__id_prefix__)
175
- files_agents = await self.file_agent_manager.list_files_for_agent(
176
- agent_id=agent_state.id, actor=actor, is_open_only=False, return_as_blocks=False
177
- )
179
+
180
+ # use cached file-agent data if available, otherwise fetch
181
+ if files_agents_cache is not None and agent_state.id in files_agents_cache:
182
+ files_agents = files_agents_cache[agent_state.id]
183
+ else:
184
+ files_agents = await self.file_agent_manager.list_files_for_agent(
185
+ agent_id=agent_state.id, actor=actor, is_open_only=False, return_as_blocks=False
186
+ )
178
187
  agent_schema = await AgentSchema.from_agent_state(
179
188
  agent_state, message_manager=self.message_manager, files_agents=files_agents, actor=actor
180
189
  )
@@ -264,15 +273,21 @@ class AgentFileManager:
264
273
  missing_ids = [agent_id for agent_id in agent_ids if agent_id not in found_ids]
265
274
  raise AgentFileExportError(f"The following agent IDs were not found: {missing_ids}")
266
275
 
276
+ # cache for file-agent relationships to avoid duplicate queries
277
+ files_agents_cache = {} # Maps agent_id to list of file_agent relationships
278
+
267
279
  # Extract unique entities across all agents
268
280
  tool_set = self._extract_unique_tools(agent_states)
269
281
  block_set = self._extract_unique_blocks(agent_states)
270
282
 
271
- # Extract sources and files from agent states BEFORE conversion
272
- source_set, file_set = await self._extract_unique_sources_and_files_from_agents(agent_states, actor)
283
+ # Extract sources and files from agent states BEFORE conversion (with caching)
284
+ source_set, file_set = await self._extract_unique_sources_and_files_from_agents(agent_states, actor, files_agents_cache)
273
285
 
274
- # Convert to schemas with ID remapping
275
- agent_schemas = [await self._convert_agent_state_to_schema(agent_state, actor=actor) for agent_state in agent_states]
286
+ # Convert to schemas with ID remapping (reusing cached file-agent data)
287
+ agent_schemas = [
288
+ await self._convert_agent_state_to_schema(agent_state, actor=actor, files_agents_cache=files_agents_cache)
289
+ for agent_state in agent_states
290
+ ]
276
291
  tool_schemas = [self._convert_tool_to_schema(tool) for tool in tool_set]
277
292
  block_schemas = [self._convert_block_to_schema(block) for block in block_set]
278
293
  source_schemas = [self._convert_source_to_schema(source) for source in source_set]
@@ -332,32 +347,66 @@ class AgentFileManager:
332
347
  # Import in dependency order
333
348
  imported_count = 0
334
349
  file_to_db_ids = {} # Maps file IDs to new database IDs
335
-
336
- # 1. Create tools first (no dependencies)
337
- for tool_schema in schema.tools:
338
- # Convert ToolSchema back to ToolCreate
339
- created_tool = await self.tool_manager.create_or_update_tool_async(
340
- pydantic_tool=Tool(**tool_schema.model_dump(exclude={"id"})), actor=actor
341
- )
342
- file_to_db_ids[tool_schema.id] = created_tool.id
343
- imported_count += 1
344
-
345
- # 2. Create blocks (no dependencies)
346
- for block_schema in schema.blocks:
347
- # Convert BlockSchema back to CreateBlock
348
- block = Block(**block_schema.model_dump(exclude={"id"}))
349
- created_block = await self.block_manager.create_or_update_block_async(block, actor)
350
- file_to_db_ids[block_schema.id] = created_block.id
351
- imported_count += 1
352
-
353
- # 3. Create sources (no dependencies)
354
- for source_schema in schema.sources:
355
- # Convert SourceSchema back to Source
356
- source_data = source_schema.model_dump(exclude={"id", "embedding", "embedding_chunk_size"})
357
- source = Source(**source_data)
358
- created_source = await self.source_manager.create_source(source, actor)
359
- file_to_db_ids[source_schema.id] = created_source.id
360
- imported_count += 1
350
+ # in-memory cache for file metadata to avoid repeated db calls
351
+ file_metadata_cache = {} # Maps database file ID to FileMetadata
352
+
353
+ # 1. Create tools first (no dependencies) - using bulk upsert for efficiency
354
+ if schema.tools:
355
+ # convert tool schemas to pydantic tools
356
+ pydantic_tools = []
357
+ for tool_schema in schema.tools:
358
+ pydantic_tools.append(Tool(**tool_schema.model_dump(exclude={"id"})))
359
+
360
+ # bulk upsert all tools at once
361
+ created_tools = await self.tool_manager.bulk_upsert_tools_async(pydantic_tools, actor)
362
+
363
+ # map file ids to database ids
364
+ # note: tools are matched by name during upsert, so we need to match by name here too
365
+ created_tools_by_name = {tool.name: tool for tool in created_tools}
366
+ for tool_schema in schema.tools:
367
+ created_tool = created_tools_by_name.get(tool_schema.name)
368
+ if created_tool:
369
+ file_to_db_ids[tool_schema.id] = created_tool.id
370
+ imported_count += 1
371
+ else:
372
+ logger.warning(f"Tool {tool_schema.name} was not created during bulk upsert")
373
+
374
+ # 2. Create blocks (no dependencies) - using batch create for efficiency
375
+ if schema.blocks:
376
+ # convert block schemas to pydantic blocks (excluding IDs to create new blocks)
377
+ pydantic_blocks = []
378
+ for block_schema in schema.blocks:
379
+ pydantic_blocks.append(Block(**block_schema.model_dump(exclude={"id"})))
380
+
381
+ # batch create all blocks at once
382
+ created_blocks = await self.block_manager.batch_create_blocks_async(pydantic_blocks, actor)
383
+
384
+ # map file ids to database ids
385
+ for block_schema, created_block in zip(schema.blocks, created_blocks):
386
+ file_to_db_ids[block_schema.id] = created_block.id
387
+ imported_count += 1
388
+
389
+ # 3. Create sources (no dependencies) - using bulk upsert for efficiency
390
+ if schema.sources:
391
+ # convert source schemas to pydantic sources
392
+ pydantic_sources = []
393
+ for source_schema in schema.sources:
394
+ source_data = source_schema.model_dump(exclude={"id", "embedding", "embedding_chunk_size"})
395
+ pydantic_sources.append(Source(**source_data))
396
+
397
+ # bulk upsert all sources at once
398
+ created_sources = await self.source_manager.bulk_upsert_sources_async(pydantic_sources, actor)
399
+
400
+ # map file ids to database ids
401
+ # note: sources are matched by name during upsert, so we need to match by name here too
402
+ created_sources_by_name = {source.name: source for source in created_sources}
403
+ for source_schema in schema.sources:
404
+ created_source = created_sources_by_name.get(source_schema.name)
405
+ if created_source:
406
+ file_to_db_ids[source_schema.id] = created_source.id
407
+ imported_count += 1
408
+ else:
409
+ logger.warning(f"Source {source_schema.name} was not created during bulk upsert")
361
410
 
362
411
  # 4. Create files (depends on sources)
363
412
  for file_schema in schema.files:
@@ -383,8 +432,10 @@ class AgentFileManager:
383
432
  file_db_id = file_to_db_ids[file_schema.id]
384
433
  source_db_id = file_to_db_ids[file_schema.source_id]
385
434
 
386
- # Get the created file metadata
387
- file_metadata = await self.file_manager.get_file_by_id(file_db_id, actor)
435
+ # Get the created file metadata (with caching)
436
+ if file_db_id not in file_metadata_cache:
437
+ file_metadata_cache[file_db_id] = await self.file_manager.get_file_by_id(file_db_id, actor)
438
+ file_metadata = file_metadata_cache[file_db_id]
388
439
 
389
440
  # Save the db call of fetching content again
390
441
  file_metadata.content = file_schema.content
@@ -447,7 +498,11 @@ class AgentFileManager:
447
498
 
448
499
  for file_agent_schema in agent_schema.files_agents:
449
500
  file_db_id = file_to_db_ids[file_agent_schema.file_id]
450
- file_metadata = await self.file_manager.get_file_by_id(file_db_id, actor)
501
+
502
+ # Use cached file metadata if available
503
+ if file_db_id not in file_metadata_cache:
504
+ file_metadata_cache[file_db_id] = await self.file_manager.get_file_by_id(file_db_id, actor)
505
+ file_metadata = file_metadata_cache[file_db_id]
451
506
  files_for_agent.append(file_metadata)
452
507
 
453
508
  if file_agent_schema.visible_content:
@@ -530,9 +585,16 @@ class AgentFileManager:
530
585
  entity_ids = [entity.id for entity in entities]
531
586
 
532
587
  # Check for duplicates within this entity type
533
- if len(entity_ids) != len(set(entity_ids)):
534
- duplicates = [id for id in entity_ids if entity_ids.count(id) > 1]
535
- errors.append(f"Duplicate {entity_type} IDs found: {set(duplicates)}")
588
+ seen = set()
589
+ duplicates = set()
590
+ for entity_id in entity_ids:
591
+ if entity_id in seen:
592
+ duplicates.add(entity_id)
593
+ else:
594
+ seen.add(entity_id)
595
+
596
+ if duplicates:
597
+ errors.append(f"Duplicate {entity_type} IDs found: {duplicates}")
536
598
 
537
599
  # Check for duplicates across all entity types
538
600
  for entity_id in entity_ids:
@@ -545,9 +607,16 @@ class AgentFileManager:
545
607
  message_ids = [msg.id for msg in agent.messages]
546
608
 
547
609
  # Check for duplicates within agent messages
548
- if len(message_ids) != len(set(message_ids)):
549
- duplicates = [id for id in message_ids if message_ids.count(id) > 1]
550
- errors.append(f"Duplicate message IDs in agent {agent.id}: {set(duplicates)}")
610
+ seen = set()
611
+ duplicates = set()
612
+ for message_id in message_ids:
613
+ if message_id in seen:
614
+ duplicates.add(message_id)
615
+ else:
616
+ seen.add(message_id)
617
+
618
+ if duplicates:
619
+ errors.append(f"Duplicate message IDs in agent {agent.id}: {duplicates}")
551
620
 
552
621
  # Check for duplicates across all entity types
553
622
  for message_id in message_ids:
@@ -58,6 +58,123 @@ class SourceManager:
58
58
  await source.create_async(session, actor=actor)
59
59
  return source.to_pydantic()
60
60
 
61
+ @enforce_types
62
+ @trace_method
63
+ async def bulk_upsert_sources_async(self, pydantic_sources: List[PydanticSource], actor: PydanticUser) -> List[PydanticSource]:
64
+ """
65
+ Bulk create or update multiple sources in a single database transaction.
66
+
67
+ Uses optimized PostgreSQL bulk upsert when available, falls back to individual
68
+ upserts for SQLite. This is much more efficient than calling create_source
69
+ in a loop.
70
+
71
+ IMPORTANT BEHAVIOR NOTES:
72
+ - Sources are matched by (name, organization_id) unique constraint, NOT by ID
73
+ - If a source with the same name already exists for the organization, it will be updated
74
+ regardless of any ID provided in the input source
75
+ - The existing source's ID is preserved during updates
76
+ - If you provide a source with an explicit ID but a name that matches an existing source,
77
+ the existing source will be updated and the provided ID will be ignored
78
+ - This matches the behavior of create_source which also checks by ID first
79
+
80
+ PostgreSQL optimization:
81
+ - Uses native ON CONFLICT (name, organization_id) DO UPDATE for atomic upserts
82
+ - All sources are processed in a single SQL statement for maximum efficiency
83
+
84
+ SQLite fallback:
85
+ - Falls back to individual create_source calls
86
+ - Still benefits from batched transaction handling
87
+
88
+ Args:
89
+ pydantic_sources: List of sources to create or update
90
+ actor: User performing the action
91
+
92
+ Returns:
93
+ List of created/updated sources
94
+ """
95
+ if not pydantic_sources:
96
+ return []
97
+
98
+ from letta.settings import settings
99
+
100
+ if settings.letta_pg_uri_no_default:
101
+ # use optimized postgresql bulk upsert
102
+ async with db_registry.async_session() as session:
103
+ return await self._bulk_upsert_postgresql(session, pydantic_sources, actor)
104
+ else:
105
+ # fallback to individual upserts for sqlite
106
+ return await self._upsert_sources_individually(pydantic_sources, actor)
107
+
108
+ @trace_method
109
+ async def _bulk_upsert_postgresql(self, session, source_data_list: List[PydanticSource], actor: PydanticUser) -> List[PydanticSource]:
110
+ """Hyper-optimized PostgreSQL bulk upsert using ON CONFLICT DO UPDATE."""
111
+ from sqlalchemy import func, select
112
+ from sqlalchemy.dialects.postgresql import insert
113
+
114
+ # prepare data for bulk insert
115
+ table = SourceModel.__table__
116
+ valid_columns = {col.name for col in table.columns}
117
+
118
+ insert_data = []
119
+ for source in source_data_list:
120
+ source_dict = source.model_dump(to_orm=True)
121
+ # set created/updated by fields
122
+
123
+ if actor:
124
+ source_dict["_created_by_id"] = actor.id
125
+ source_dict["_last_updated_by_id"] = actor.id
126
+ source_dict["organization_id"] = actor.organization_id
127
+
128
+ # filter to only include columns that exist in the table
129
+ filtered_dict = {k: v for k, v in source_dict.items() if k in valid_columns}
130
+ insert_data.append(filtered_dict)
131
+
132
+ # use postgresql's native bulk upsert
133
+ stmt = insert(table).values(insert_data)
134
+
135
+ # on conflict, update all columns except id, created_at, and _created_by_id
136
+ excluded = stmt.excluded
137
+ update_dict = {}
138
+ for col in table.columns:
139
+ if col.name not in ("id", "created_at", "_created_by_id"):
140
+ if col.name == "updated_at":
141
+ update_dict[col.name] = func.now()
142
+ else:
143
+ update_dict[col.name] = excluded[col.name]
144
+
145
+ upsert_stmt = stmt.on_conflict_do_update(index_elements=["name", "organization_id"], set_=update_dict)
146
+
147
+ await session.execute(upsert_stmt)
148
+ await session.commit()
149
+
150
+ # fetch results
151
+ source_names = [source.name for source in source_data_list]
152
+ result_query = select(SourceModel).where(
153
+ SourceModel.name.in_(source_names), SourceModel.organization_id == actor.organization_id, SourceModel.is_deleted == False
154
+ )
155
+ result = await session.execute(result_query)
156
+ return [source.to_pydantic() for source in result.scalars()]
157
+
158
+ @trace_method
159
+ async def _upsert_sources_individually(self, source_data_list: List[PydanticSource], actor: PydanticUser) -> List[PydanticSource]:
160
+ """Fallback to individual upserts for SQLite."""
161
+ sources = []
162
+ for source in source_data_list:
163
+ # try to get existing source by name
164
+ existing_source = await self.get_source_by_name(source.name, actor)
165
+ if existing_source:
166
+ # update existing source
167
+ from letta.schemas.source import SourceUpdate
168
+
169
+ update_data = source.model_dump(exclude={"id"}, exclude_none=True)
170
+ updated_source = await self.update_source(existing_source.id, SourceUpdate(**update_data), actor)
171
+ sources.append(updated_source)
172
+ else:
173
+ # create new source
174
+ created_source = await self.create_source(source, actor)
175
+ sources.append(created_source)
176
+ return sources
177
+
61
178
  @enforce_types
62
179
  @trace_method
63
180
  async def update_source(self, source_id: str, source_update: SourceUpdate, actor: PydanticUser) -> PydanticSource:
@@ -176,7 +176,9 @@ class LettaBuiltinToolExecutor(ToolExecutor):
176
176
  app = AsyncFirecrawlApp(api_key=firecrawl_api_key)
177
177
 
178
178
  # Process all search tasks in parallel
179
- search_task_coroutines = [self._process_single_search_task(app, task, limit, return_raw, api_key_source) for task in search_tasks]
179
+ search_task_coroutines = [
180
+ self._process_single_search_task(app, task, limit, return_raw, api_key_source, agent_state) for task in search_tasks
181
+ ]
180
182
 
181
183
  # Execute all searches concurrently
182
184
  search_results = await asyncio.gather(*search_task_coroutines, return_exceptions=True)
@@ -205,7 +207,7 @@ class LettaBuiltinToolExecutor(ToolExecutor):
205
207
 
206
208
  @trace_method
207
209
  async def _process_single_search_task(
208
- self, app: "AsyncFirecrawlApp", task: SearchTask, limit: int, return_raw: bool, api_key_source: str
210
+ self, app: "AsyncFirecrawlApp", task: SearchTask, limit: int, return_raw: bool, api_key_source: str, agent_state: "AgentState"
209
211
  ) -> Dict[str, Any]:
210
212
  """Process a single search task."""
211
213
  from firecrawl import ScrapeOptions
@@ -246,7 +248,9 @@ class LettaBuiltinToolExecutor(ToolExecutor):
246
248
  for result in search_result.get("data"):
247
249
  if result.get("markdown"):
248
250
  # Create async task for OpenAI analysis
249
- analysis_task = self._analyze_document_with_openai(client, result["markdown"], task.query, task.question)
251
+ analysis_task = self._analyze_document_with_openai(
252
+ client, result["markdown"], task.query, task.question, agent_state
253
+ )
250
254
  analysis_tasks.append(analysis_task)
251
255
  results_with_markdown.append(result)
252
256
  else:
@@ -300,7 +304,9 @@ class LettaBuiltinToolExecutor(ToolExecutor):
300
304
  return {"query": task.query, "question": task.question, "raw_results": search_result}
301
305
 
302
306
  @trace_method
303
- async def _analyze_document_with_openai(self, client, markdown_content: str, query: str, question: str) -> Optional[DocumentAnalysis]:
307
+ async def _analyze_document_with_openai(
308
+ self, client, markdown_content: str, query: str, question: str, agent_state: "AgentState"
309
+ ) -> Optional[DocumentAnalysis]:
304
310
  """Use OpenAI to analyze a document and extract relevant passages using line numbers."""
305
311
  original_length = len(markdown_content)
306
312
 
@@ -324,7 +330,9 @@ class LettaBuiltinToolExecutor(ToolExecutor):
324
330
  # Time the OpenAI request
325
331
  start_time = time.time()
326
332
 
327
- model = os.getenv(WEB_SEARCH_MODEL_ENV_VAR_NAME, WEB_SEARCH_MODEL_ENV_VAR_DEFAULT_VALUE)
333
+ # Check agent state env vars first, then fall back to os.getenv
334
+ agent_state_tool_env_vars = agent_state.get_agent_env_vars_as_dict()
335
+ model = agent_state_tool_env_vars.get(WEB_SEARCH_MODEL_ENV_VAR_NAME) or WEB_SEARCH_MODEL_ENV_VAR_DEFAULT_VALUE
328
336
  logger.info(f"Using model {model} for web search result parsing")
329
337
  response = await client.beta.chat.completions.parse(
330
338
  model=model,