letta-nightly 0.8.10.dev20250707035305__tar.gz → 0.8.11.dev20250708000504__tar.gz

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

Potentially problematic release.


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

Files changed (417) hide show
  1. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/PKG-INFO +1 -1
  2. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/__init__.py +1 -1
  3. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/constants.py +1 -0
  4. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/pinecone_utils.py +12 -2
  5. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/jobs/scheduler.py +45 -91
  6. letta_nightly-0.8.11.dev20250708000504/letta/schemas/source_metadata.py +32 -0
  7. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/db.py +31 -0
  8. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/sources.py +23 -6
  9. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_manager.py +70 -0
  10. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/chunker/line_chunker.py +32 -6
  11. letta_nightly-0.8.11.dev20250708000504/letta/services/file_processor/chunker/llama_index_chunker.py +169 -0
  12. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/embedder/openai_embedder.py +1 -1
  13. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/file_processor.py +59 -15
  14. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/files_tool_executor.py +1 -1
  15. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/settings.py +1 -1
  16. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/pyproject.toml +1 -1
  17. letta_nightly-0.8.10.dev20250707035305/letta/services/file_processor/chunker/llama_index_chunker.py +0 -119
  18. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/LICENSE +0 -0
  19. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/README.md +0 -0
  20. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agent.py +0 -0
  21. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/__init__.py +0 -0
  22. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/base_agent.py +0 -0
  23. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/ephemeral_agent.py +0 -0
  24. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/ephemeral_summary_agent.py +0 -0
  25. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/exceptions.py +0 -0
  26. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/helpers.py +0 -0
  27. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/letta_agent.py +0 -0
  28. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/letta_agent_batch.py +0 -0
  29. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/voice_agent.py +0 -0
  30. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/voice_sleeptime_agent.py +0 -0
  31. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/cli/cli.py +0 -0
  32. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/cli/cli_load.py +0 -0
  33. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/client/__init__.py +0 -0
  34. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/client/client.py +0 -0
  35. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/client/streaming.py +0 -0
  36. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/client/utils.py +0 -0
  37. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/config.py +0 -0
  38. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/data_sources/__init__.py +0 -0
  39. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/data_sources/connectors.py +0 -0
  40. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/data_sources/connectors_helper.py +0 -0
  41. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/data_sources/redis_client.py +0 -0
  42. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/embeddings.py +0 -0
  43. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/errors.py +0 -0
  44. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/__init__.py +0 -0
  45. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/ast_parsers.py +0 -0
  46. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/async_composio_toolset.py +0 -0
  47. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/composio_helpers.py +0 -0
  48. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/function_sets/base.py +0 -0
  49. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/function_sets/builtin.py +0 -0
  50. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/function_sets/extras.py +0 -0
  51. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/function_sets/files.py +0 -0
  52. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/function_sets/multi_agent.py +0 -0
  53. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/function_sets/voice.py +0 -0
  54. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/functions.py +0 -0
  55. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/helpers.py +0 -0
  56. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/interface.py +0 -0
  57. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/mcp_client/__init__.py +0 -0
  58. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/mcp_client/base_client.py +0 -0
  59. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/mcp_client/exceptions.py +0 -0
  60. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/mcp_client/sse_client.py +0 -0
  61. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/mcp_client/stdio_client.py +0 -0
  62. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/mcp_client/types.py +0 -0
  63. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/prompts.py +0 -0
  64. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/schema_generator.py +0 -0
  65. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/types.py +0 -0
  66. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/groups/dynamic_multi_agent.py +0 -0
  67. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/groups/helpers.py +0 -0
  68. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/groups/round_robin_multi_agent.py +0 -0
  69. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/groups/sleeptime_multi_agent.py +0 -0
  70. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/groups/sleeptime_multi_agent_v2.py +0 -0
  71. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/groups/supervisor_multi_agent.py +0 -0
  72. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/__init__.py +0 -0
  73. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/composio_helpers.py +0 -0
  74. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/converters.py +0 -0
  75. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/datetime_helpers.py +0 -0
  76. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/decorators.py +0 -0
  77. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/json_helpers.py +0 -0
  78. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/message_helper.py +0 -0
  79. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/singleton.py +0 -0
  80. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/tool_execution_helper.py +0 -0
  81. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/tool_rule_solver.py +0 -0
  82. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/humans/__init__.py +0 -0
  83. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/humans/examples/basic.txt +0 -0
  84. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/humans/examples/cs_phd.txt +0 -0
  85. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/interface.py +0 -0
  86. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/interfaces/__init__.py +0 -0
  87. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/interfaces/anthropic_streaming_interface.py +0 -0
  88. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/interfaces/openai_chat_completions_streaming_interface.py +0 -0
  89. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/interfaces/openai_streaming_interface.py +0 -0
  90. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/interfaces/utils.py +0 -0
  91. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/jobs/__init__.py +0 -0
  92. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/jobs/helpers.py +0 -0
  93. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/jobs/llm_batch_job_polling.py +0 -0
  94. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/jobs/types.py +0 -0
  95. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/__init__.py +0 -0
  96. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/anthropic.py +0 -0
  97. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/anthropic_client.py +0 -0
  98. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/aws_bedrock.py +0 -0
  99. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/azure_openai.py +0 -0
  100. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/azure_openai_constants.py +0 -0
  101. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/bedrock_client.py +0 -0
  102. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/cohere.py +0 -0
  103. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/deepseek.py +0 -0
  104. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/google_ai_client.py +0 -0
  105. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/google_constants.py +0 -0
  106. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/google_vertex_client.py +0 -0
  107. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/helpers.py +0 -0
  108. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/llm_api_tools.py +0 -0
  109. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/llm_client.py +0 -0
  110. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/llm_client_base.py +0 -0
  111. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/mistral.py +0 -0
  112. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/openai.py +0 -0
  113. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/openai_client.py +0 -0
  114. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/README.md +0 -0
  115. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/__init__.py +0 -0
  116. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/chat_completion_proxy.py +0 -0
  117. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/constants.py +0 -0
  118. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/function_parser.py +0 -0
  119. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/grammars/__init__.py +0 -0
  120. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/grammars/gbnf_grammar_generator.py +0 -0
  121. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/grammars/json.gbnf +0 -0
  122. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/grammars/json_func_calls_with_inner_thoughts.gbnf +0 -0
  123. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/json_parser.py +0 -0
  124. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/koboldcpp/api.py +0 -0
  125. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/koboldcpp/settings.py +0 -0
  126. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llamacpp/api.py +0 -0
  127. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llamacpp/settings.py +0 -0
  128. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/__init__.py +0 -0
  129. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/airoboros.py +0 -0
  130. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/chatml.py +0 -0
  131. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py +0 -0
  132. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/dolphin.py +0 -0
  133. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/llama3.py +0 -0
  134. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/simple_summary_wrapper.py +0 -0
  135. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/wrapper_base.py +0 -0
  136. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/zephyr.py +0 -0
  137. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/lmstudio/api.py +0 -0
  138. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/lmstudio/settings.py +0 -0
  139. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/ollama/api.py +0 -0
  140. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/ollama/settings.py +0 -0
  141. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/settings/__init__.py +0 -0
  142. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/settings/deterministic_mirostat.py +0 -0
  143. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/settings/settings.py +0 -0
  144. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/settings/simple.py +0 -0
  145. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/utils.py +0 -0
  146. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/vllm/api.py +0 -0
  147. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/webui/api.py +0 -0
  148. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/webui/legacy_api.py +0 -0
  149. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/webui/legacy_settings.py +0 -0
  150. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/webui/settings.py +0 -0
  151. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/log.py +0 -0
  152. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/main.py +0 -0
  153. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/memory.py +0 -0
  154. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/openai_backcompat/__init__.py +0 -0
  155. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/openai_backcompat/openai_object.py +0 -0
  156. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/__all__.py +0 -0
  157. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/__init__.py +0 -0
  158. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/agent.py +0 -0
  159. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/agents_tags.py +0 -0
  160. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/base.py +0 -0
  161. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/block.py +0 -0
  162. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/block_history.py +0 -0
  163. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/blocks_agents.py +0 -0
  164. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/custom_columns.py +0 -0
  165. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/enums.py +0 -0
  166. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/errors.py +0 -0
  167. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/file.py +0 -0
  168. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/files_agents.py +0 -0
  169. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/group.py +0 -0
  170. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/groups_agents.py +0 -0
  171. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/groups_blocks.py +0 -0
  172. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/identities_agents.py +0 -0
  173. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/identities_blocks.py +0 -0
  174. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/identity.py +0 -0
  175. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/job.py +0 -0
  176. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/job_messages.py +0 -0
  177. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/llm_batch_items.py +0 -0
  178. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/llm_batch_job.py +0 -0
  179. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/mcp_server.py +0 -0
  180. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/message.py +0 -0
  181. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/mixins.py +0 -0
  182. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/organization.py +0 -0
  183. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/passage.py +0 -0
  184. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/provider.py +0 -0
  185. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/provider_trace.py +0 -0
  186. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/sandbox_config.py +0 -0
  187. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/source.py +0 -0
  188. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/sources_agents.py +0 -0
  189. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/sqlalchemy_base.py +0 -0
  190. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/sqlite_functions.py +0 -0
  191. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/step.py +0 -0
  192. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/tool.py +0 -0
  193. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/tools_agents.py +0 -0
  194. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/user.py +0 -0
  195. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/otel/__init__.py +0 -0
  196. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/otel/context.py +0 -0
  197. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/otel/events.py +0 -0
  198. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/otel/metric_registry.py +0 -0
  199. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/otel/metrics.py +0 -0
  200. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/otel/resource.py +0 -0
  201. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/otel/tracing.py +0 -0
  202. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/__init__.py +0 -0
  203. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/anna_pa.txt +0 -0
  204. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/google_search_persona.txt +0 -0
  205. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/memgpt_doc.txt +0 -0
  206. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/memgpt_starter.txt +0 -0
  207. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/o1_persona.txt +0 -0
  208. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/sam.txt +0 -0
  209. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/sam_pov.txt +0 -0
  210. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/sam_simple_pov_gpt35.txt +0 -0
  211. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/sleeptime_doc_persona.txt +0 -0
  212. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/sleeptime_memory_persona.txt +0 -0
  213. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/sqldb/test.db +0 -0
  214. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/voice_memory_persona.txt +0 -0
  215. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/plugins/README.md +0 -0
  216. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/plugins/__init__.py +0 -0
  217. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/plugins/defaults.py +0 -0
  218. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/plugins/plugins.py +0 -0
  219. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/__init__.py +0 -0
  220. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/gpt_summarize.py +0 -0
  221. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/gpt_system.py +0 -0
  222. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_base.txt +0 -0
  223. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_chat.txt +0 -0
  224. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_chat_compressed.txt +0 -0
  225. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_chat_fstring.txt +0 -0
  226. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_convo_only.txt +0 -0
  227. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_doc.txt +0 -0
  228. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_gpt35_extralong.txt +0 -0
  229. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_intuitive_knowledge.txt +0 -0
  230. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_memory_only.txt +0 -0
  231. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_modified_chat.txt +0 -0
  232. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_modified_o1.txt +0 -0
  233. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_offline_memory.txt +0 -0
  234. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_offline_memory_chat.txt +0 -0
  235. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_sleeptime_chat.txt +0 -0
  236. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_v2_chat.txt +0 -0
  237. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/react.txt +0 -0
  238. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/sleeptime.txt +0 -0
  239. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/sleeptime_doc_ingest.txt +0 -0
  240. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/sleeptime_v2.txt +0 -0
  241. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/summary_system_prompt.txt +0 -0
  242. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/voice_chat.txt +0 -0
  243. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/voice_sleeptime.txt +0 -0
  244. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/workflow.txt +0 -0
  245. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/pytest.ini +0 -0
  246. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/agent.py +0 -0
  247. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/block.py +0 -0
  248. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/embedding_config.py +0 -0
  249. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/embedding_config_overrides.py +0 -0
  250. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/enums.py +0 -0
  251. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/environment_variables.py +0 -0
  252. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/file.py +0 -0
  253. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/group.py +0 -0
  254. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/health.py +0 -0
  255. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/identity.py +0 -0
  256. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/job.py +0 -0
  257. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/letta_base.py +0 -0
  258. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/letta_message.py +0 -0
  259. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/letta_message_content.py +0 -0
  260. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/letta_request.py +0 -0
  261. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/letta_response.py +0 -0
  262. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/letta_stop_reason.py +0 -0
  263. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/llm_batch_job.py +0 -0
  264. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/llm_config.py +0 -0
  265. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/llm_config_overrides.py +0 -0
  266. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/mcp.py +0 -0
  267. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/memory.py +0 -0
  268. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/message.py +0 -0
  269. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/openai/chat_completion_request.py +0 -0
  270. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/openai/chat_completion_response.py +0 -0
  271. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/openai/chat_completions.py +0 -0
  272. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/openai/embedding_response.py +0 -0
  273. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/openai/openai.py +0 -0
  274. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/organization.py +0 -0
  275. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/passage.py +0 -0
  276. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/pip_requirement.py +0 -0
  277. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/provider_trace.py +0 -0
  278. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/providers.py +0 -0
  279. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/response_format.py +0 -0
  280. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/run.py +0 -0
  281. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/sandbox_config.py +0 -0
  282. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/source.py +0 -0
  283. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/step.py +0 -0
  284. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/tool.py +0 -0
  285. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/tool_execution_result.py +0 -0
  286. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/tool_rule.py +0 -0
  287. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/usage.py +0 -0
  288. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/user.py +0 -0
  289. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/__init__.py +0 -0
  290. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/marshmallow_agent.py +0 -0
  291. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/marshmallow_agent_environment_variable.py +0 -0
  292. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/marshmallow_base.py +0 -0
  293. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/marshmallow_block.py +0 -0
  294. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/marshmallow_custom_fields.py +0 -0
  295. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/marshmallow_message.py +0 -0
  296. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/marshmallow_tag.py +0 -0
  297. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/marshmallow_tool.py +0 -0
  298. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/pydantic_agent_schema.py +0 -0
  299. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/__init__.py +0 -0
  300. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/constants.py +0 -0
  301. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/generate_openapi_schema.sh +0 -0
  302. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/__init__.py +0 -0
  303. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/app.py +0 -0
  304. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/auth/__init__.py +0 -0
  305. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/auth/index.py +0 -0
  306. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/auth_token.py +0 -0
  307. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/chat_completions_interface.py +0 -0
  308. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/interface.py +0 -0
  309. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/json_parser.py +0 -0
  310. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/__init__.py +0 -0
  311. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/openai/chat_completions/__init__.py +0 -0
  312. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +0 -0
  313. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/__init__.py +0 -0
  314. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/agents.py +0 -0
  315. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/blocks.py +0 -0
  316. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/embeddings.py +0 -0
  317. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/groups.py +0 -0
  318. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/health.py +0 -0
  319. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/identities.py +0 -0
  320. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/jobs.py +0 -0
  321. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/llms.py +0 -0
  322. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/messages.py +0 -0
  323. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/organizations.py +0 -0
  324. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/providers.py +0 -0
  325. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/runs.py +0 -0
  326. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/sandbox_configs.py +0 -0
  327. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/steps.py +0 -0
  328. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/tags.py +0 -0
  329. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/telemetry.py +0 -0
  330. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/tools.py +0 -0
  331. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/users.py +0 -0
  332. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/voice.py +0 -0
  333. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/static_files.py +0 -0
  334. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/streaming_response.py +0 -0
  335. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/utils.py +0 -0
  336. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/server.py +0 -0
  337. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/startup.sh +0 -0
  338. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/static_files/assets/index-048c9598.js +0 -0
  339. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/static_files/assets/index-0e31b727.css +0 -0
  340. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/static_files/favicon.ico +0 -0
  341. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/static_files/index.html +0 -0
  342. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/static_files/memgpt_logo_transparent.png +0 -0
  343. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/utils.py +0 -0
  344. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/ws_api/__init__.py +0 -0
  345. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/ws_api/example_client.py +0 -0
  346. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/ws_api/interface.py +0 -0
  347. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/ws_api/protocol.py +0 -0
  348. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/ws_api/server.py +0 -0
  349. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/__init__.py +0 -0
  350. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/agent_manager.py +0 -0
  351. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/block_manager.py +0 -0
  352. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/context_window_calculator/__init__.py +0 -0
  353. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/context_window_calculator/context_window_calculator.py +0 -0
  354. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/context_window_calculator/token_counter.py +0 -0
  355. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/__init__.py +0 -0
  356. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/chunker/__init__.py +0 -0
  357. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/embedder/__init__.py +0 -0
  358. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/embedder/base_embedder.py +0 -0
  359. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/embedder/pinecone_embedder.py +0 -0
  360. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/file_types.py +0 -0
  361. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/parser/__init__.py +0 -0
  362. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/parser/base_parser.py +0 -0
  363. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/parser/mistral_parser.py +0 -0
  364. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/types.py +0 -0
  365. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/files_agents_manager.py +0 -0
  366. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/group_manager.py +0 -0
  367. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/helpers/agent_manager_helper.py +0 -0
  368. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/helpers/tool_execution_helper.py +0 -0
  369. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/helpers/tool_parser_helper.py +0 -0
  370. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/identity_manager.py +0 -0
  371. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/job_manager.py +0 -0
  372. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/llm_batch_manager.py +0 -0
  373. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/mcp/__init__.py +0 -0
  374. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/mcp/base_client.py +0 -0
  375. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/mcp/sse_client.py +0 -0
  376. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/mcp/stdio_client.py +0 -0
  377. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/mcp/streamable_http_client.py +0 -0
  378. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/mcp/types.py +0 -0
  379. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/mcp_manager.py +0 -0
  380. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/message_manager.py +0 -0
  381. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/organization_manager.py +0 -0
  382. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/passage_manager.py +0 -0
  383. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/per_agent_lock_manager.py +0 -0
  384. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/provider_manager.py +0 -0
  385. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/sandbox_config_manager.py +0 -0
  386. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/source_manager.py +0 -0
  387. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/step_manager.py +0 -0
  388. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/summarizer/__init__.py +0 -0
  389. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/summarizer/enums.py +0 -0
  390. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/summarizer/summarizer.py +0 -0
  391. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/telemetry_manager.py +0 -0
  392. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/__init__.py +0 -0
  393. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/builtin_tool_executor.py +0 -0
  394. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/composio_tool_executor.py +0 -0
  395. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/core_tool_executor.py +0 -0
  396. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/mcp_tool_executor.py +0 -0
  397. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/multi_agent_tool_executor.py +0 -0
  398. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/tool_execution_manager.py +0 -0
  399. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/tool_execution_sandbox.py +0 -0
  400. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/tool_executor.py +0 -0
  401. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/tool_executor_base.py +0 -0
  402. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_manager.py +0 -0
  403. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_sandbox/__init__.py +0 -0
  404. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_sandbox/base.py +0 -0
  405. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_sandbox/e2b_sandbox.py +0 -0
  406. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_sandbox/local_sandbox.py +0 -0
  407. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/user_manager.py +0 -0
  408. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/streaming_interface.py +0 -0
  409. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/streaming_utils.py +0 -0
  410. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/system.py +0 -0
  411. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/templates/__init__.py +0 -0
  412. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/templates/sandbox_code_file.py.j2 +0 -0
  413. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/templates/sandbox_code_file_async.py.j2 +0 -0
  414. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/templates/summary_request_text.j2 +0 -0
  415. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/templates/template_helper.py +0 -0
  416. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/types/__init__.py +0 -0
  417. {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: letta-nightly
3
- Version: 0.8.10.dev20250707035305
3
+ Version: 0.8.11.dev20250708000504
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.10"
8
+ __version__ = "0.8.11"
9
9
 
10
10
 
11
11
  if os.environ.get("LETTA_VERSION"):
@@ -371,3 +371,4 @@ PINECONE_TEXT_FIELD_NAME = "chunk_text"
371
371
  PINECONE_METRIC = "cosine"
372
372
  PINECONE_CLOUD = "aws"
373
373
  PINECONE_REGION = "us-east-1"
374
+ PINECONE_MAX_BATCH_SIZE = 96
@@ -2,7 +2,14 @@ from typing import Any, Dict, List
2
2
 
3
3
  from pinecone import PineconeAsyncio
4
4
 
5
- from letta.constants import PINECONE_CLOUD, PINECONE_EMBEDDING_MODEL, PINECONE_METRIC, PINECONE_REGION, PINECONE_TEXT_FIELD_NAME
5
+ from letta.constants import (
6
+ PINECONE_CLOUD,
7
+ PINECONE_EMBEDDING_MODEL,
8
+ PINECONE_MAX_BATCH_SIZE,
9
+ PINECONE_METRIC,
10
+ PINECONE_REGION,
11
+ PINECONE_TEXT_FIELD_NAME,
12
+ )
6
13
  from letta.log import get_logger
7
14
  from letta.schemas.user import User
8
15
  from letta.settings import settings
@@ -90,7 +97,10 @@ async def upsert_records_to_pinecone_index(records: List[dict], actor: User):
90
97
  async with PineconeAsyncio(api_key=settings.pinecone_api_key) as pc:
91
98
  description = await pc.describe_index(name=settings.pinecone_source_index)
92
99
  async with pc.IndexAsyncio(host=description.index.host) as dense_index:
93
- await dense_index.upsert_records(actor.organization_id, records)
100
+ # Process records in batches to avoid exceeding Pinecone limits
101
+ for i in range(0, len(records), PINECONE_MAX_BATCH_SIZE):
102
+ batch = records[i : i + PINECONE_MAX_BATCH_SIZE]
103
+ await dense_index.upsert_records(actor.organization_id, batch)
94
104
 
95
105
 
96
106
  async def search_pinecone_index(query: str, limit: int, filter: Dict[str, Any], actor: User) -> Dict[str, Any]:
@@ -4,10 +4,11 @@ from typing import Optional
4
4
 
5
5
  from apscheduler.schedulers.asyncio import AsyncIOScheduler
6
6
  from apscheduler.triggers.interval import IntervalTrigger
7
+ from sqlalchemy import text
7
8
 
8
9
  from letta.jobs.llm_batch_job_polling import poll_running_llm_batches
9
10
  from letta.log import get_logger
10
- from letta.server.db import db_context
11
+ from letta.server.db import db_registry
11
12
  from letta.server.server import SyncServer
12
13
  from letta.settings import settings
13
14
 
@@ -16,68 +17,54 @@ scheduler = AsyncIOScheduler()
16
17
  logger = get_logger(__name__)
17
18
  ADVISORY_LOCK_KEY = 0x12345678ABCDEF00
18
19
 
19
- _advisory_lock_conn = None # Holds the raw DB connection if leader
20
- _advisory_lock_cur = None # Holds the cursor for the lock connection if leader
20
+ _advisory_lock_session = None # Holds the async session if leader
21
21
  _lock_retry_task: Optional[asyncio.Task] = None # Background task handle for non-leaders
22
22
  _is_scheduler_leader = False # Flag indicating if this instance runs the scheduler
23
23
 
24
24
 
25
25
  async def _try_acquire_lock_and_start_scheduler(server: SyncServer) -> bool:
26
26
  """Attempts to acquire lock, starts scheduler if successful."""
27
- global _advisory_lock_conn, _advisory_lock_cur, _is_scheduler_leader, scheduler
27
+ global _advisory_lock_session, _is_scheduler_leader, scheduler
28
28
 
29
29
  if _is_scheduler_leader:
30
30
  return True # Already leading
31
31
 
32
- raw_conn = None
33
- cur = None
32
+ lock_session = None
34
33
  acquired_lock = False
35
34
  try:
36
- # Use a temporary connection context for the attempt initially
37
- with db_context() as session:
35
+ async with db_registry.async_session() as session:
38
36
  engine = session.get_bind()
39
37
  engine_name = engine.name
40
38
  logger.info(f"Database engine type: {engine_name}")
41
-
42
39
  if engine_name != "postgresql":
43
40
  logger.warning(f"Advisory locks not supported for {engine_name} database. Starting scheduler without leader election.")
44
- acquired_lock = True # For SQLite, assume we can start the scheduler
41
+ acquired_lock = True
45
42
  else:
46
- # Get raw connection - MUST be kept open if lock is acquired
47
- raw_conn = engine.raw_connection()
48
- cur = raw_conn.cursor()
49
-
50
- cur.execute("SELECT pg_try_advisory_lock(CAST(%s AS bigint))", (ADVISORY_LOCK_KEY,))
51
- acquired_lock = cur.fetchone()[0]
43
+ lock_session = db_registry.get_async_session_factory()()
44
+ result = await lock_session.execute(
45
+ text("SELECT pg_try_advisory_lock(CAST(:lock_key AS bigint))"), {"lock_key": ADVISORY_LOCK_KEY}
46
+ )
47
+ acquired_lock = result.scalar()
52
48
 
53
49
  if not acquired_lock:
54
- if cur:
55
- cur.close()
56
- if raw_conn:
57
- raw_conn.close()
50
+ if lock_session:
51
+ await lock_session.close()
58
52
  logger.info("Scheduler lock held by another instance.")
59
53
  return False
60
54
 
61
- # --- Lock Acquired ---
62
55
  if engine_name == "postgresql":
63
56
  logger.info("Acquired PostgreSQL advisory lock.")
64
- _advisory_lock_conn = raw_conn # Keep connection for lock duration
65
- _advisory_lock_cur = cur # Keep cursor for lock duration
66
- raw_conn = None # Prevent closing in finally block
67
- cur = None # Prevent closing in finally block
57
+ _advisory_lock_session = lock_session
58
+ lock_session = None
68
59
  else:
69
60
  logger.info("Starting scheduler for non-PostgreSQL database.")
70
- # For SQLite, we don't need to keep the connection open
71
- if cur:
72
- cur.close()
73
- if raw_conn:
74
- raw_conn.close()
75
- raw_conn = None
76
- cur = None
61
+ if lock_session:
62
+ await lock_session.close()
63
+ lock_session = None
77
64
 
78
65
  trigger = IntervalTrigger(
79
66
  seconds=settings.poll_running_llm_batches_interval_seconds,
80
- jitter=10, # Jitter for the job execution
67
+ jitter=10,
81
68
  )
82
69
  scheduler.add_job(
83
70
  poll_running_llm_batches,
@@ -91,7 +78,7 @@ async def _try_acquire_lock_and_start_scheduler(server: SyncServer) -> bool:
91
78
 
92
79
  if not scheduler.running:
93
80
  scheduler.start()
94
- elif scheduler.state == 2: # PAUSED
81
+ elif scheduler.state == 2:
95
82
  scheduler.resume()
96
83
 
97
84
  _is_scheduler_leader = True
@@ -99,38 +86,27 @@ async def _try_acquire_lock_and_start_scheduler(server: SyncServer) -> bool:
99
86
 
100
87
  except Exception as e:
101
88
  logger.error(f"Error during lock acquisition/scheduler start: {e}", exc_info=True)
102
- if acquired_lock: # If lock was acquired before error, try to release
89
+ if acquired_lock:
103
90
  logger.warning("Attempting to release lock due to error during startup.")
104
91
  try:
105
- # Use the cursor/connection we were about to store
106
- _advisory_lock_cur = cur
107
- _advisory_lock_conn = raw_conn
108
- await _release_advisory_lock() # Attempt cleanup
92
+ _advisory_lock_session = lock_session
93
+ await _release_advisory_lock()
109
94
  except Exception as unlock_err:
110
95
  logger.error(f"Failed to release lock during error handling: {unlock_err}", exc_info=True)
111
96
  finally:
112
- # Ensure globals are cleared after failed attempt
113
- _advisory_lock_cur = None
114
- _advisory_lock_conn = None
97
+ _advisory_lock_session = None
115
98
  _is_scheduler_leader = False
116
99
 
117
- # Ensure scheduler is stopped if we failed partially
118
100
  if scheduler.running:
119
101
  try:
120
102
  scheduler.shutdown(wait=False)
121
103
  except:
122
- pass # Best effort
104
+ pass
123
105
  return False
124
106
  finally:
125
- # Clean up temporary resources if lock wasn't acquired or error occurred before storing
126
- if cur:
127
- try:
128
- cur.close()
129
- except:
130
- pass
131
- if raw_conn:
107
+ if lock_session:
132
108
  try:
133
- raw_conn.close()
109
+ await lock_session.close()
134
110
  except:
135
111
  pass
136
112
 
@@ -141,63 +117,50 @@ async def _background_lock_retry_loop(server: SyncServer):
141
117
  logger.info("Starting background task to periodically check for scheduler lock.")
142
118
 
143
119
  while True:
144
- if _is_scheduler_leader: # Should be cancelled first, but safety check
120
+ if _is_scheduler_leader:
145
121
  break
146
122
  try:
147
123
  wait_time = settings.poll_lock_retry_interval_seconds
148
124
  await asyncio.sleep(wait_time)
149
125
 
150
- # Re-check state before attempting lock
151
126
  if _is_scheduler_leader or _lock_retry_task is None:
152
- break # Stop if became leader or task was cancelled
127
+ break
153
128
 
154
129
  acquired = await _try_acquire_lock_and_start_scheduler(server)
155
130
  if acquired:
156
131
  logger.info("Background task acquired lock and started scheduler.")
157
- _lock_retry_task = None # Clear self handle
158
- break # Exit loop, we are now the leader
132
+ _lock_retry_task = None
133
+ break
159
134
 
160
135
  except asyncio.CancelledError:
161
136
  logger.info("Background lock retry task cancelled.")
162
137
  break
163
138
  except Exception as e:
164
139
  logger.error(f"Error in background lock retry loop: {e}", exc_info=True)
165
- # Avoid tight loop on persistent errors
166
140
  await asyncio.sleep(settings.poll_lock_retry_interval_seconds)
167
141
 
168
142
 
169
143
  async def _release_advisory_lock():
170
- """Releases the advisory lock using the stored connection."""
171
- global _advisory_lock_conn, _advisory_lock_cur
144
+ """Releases the advisory lock using the stored session."""
145
+ global _advisory_lock_session
172
146
 
173
- lock_cur = _advisory_lock_cur
174
- lock_conn = _advisory_lock_conn
175
- _advisory_lock_cur = None # Clear global immediately
176
- _advisory_lock_conn = None # Clear global immediately
147
+ lock_session = _advisory_lock_session
148
+ _advisory_lock_session = None
177
149
 
178
- if lock_cur is not None and lock_conn is not None:
150
+ if lock_session is not None:
179
151
  logger.info(f"Attempting to release PostgreSQL advisory lock {ADVISORY_LOCK_KEY}")
180
152
  try:
181
- # Try to execute unlock - connection/cursor validity is checked by attempting the operation
182
- lock_cur.execute("SELECT pg_advisory_unlock(CAST(%s AS bigint))", (ADVISORY_LOCK_KEY,))
183
- lock_cur.fetchone() # Consume result
184
- lock_conn.commit()
153
+ await lock_session.execute(text("SELECT pg_advisory_unlock(CAST(:lock_key AS bigint))"), {"lock_key": ADVISORY_LOCK_KEY})
185
154
  logger.info(f"Executed pg_advisory_unlock for lock {ADVISORY_LOCK_KEY}")
186
155
  except Exception as e:
187
156
  logger.error(f"Error executing pg_advisory_unlock: {e}", exc_info=True)
188
157
  finally:
189
- # Ensure resources are closed regardless of unlock success
190
- try:
191
- if lock_cur:
192
- lock_cur.close()
193
- except Exception as e:
194
- logger.error(f"Error closing advisory lock cursor: {e}", exc_info=True)
195
158
  try:
196
- if lock_conn:
197
- lock_conn.close()
198
- logger.info("Closed database connection that held advisory lock.")
159
+ if lock_session:
160
+ await lock_session.close()
161
+ logger.info("Closed database session that held advisory lock.")
199
162
  except Exception as e:
200
- logger.error(f"Error closing advisory lock connection: {e}", exc_info=True)
163
+ logger.error(f"Error closing advisory lock session: {e}", exc_info=True)
201
164
  else:
202
165
  logger.info("No PostgreSQL advisory lock to release (likely using SQLite or non-PostgreSQL database).")
203
166
 
@@ -220,7 +183,6 @@ async def start_scheduler_with_leader_election(server: SyncServer):
220
183
  acquired_immediately = await _try_acquire_lock_and_start_scheduler(server)
221
184
 
222
185
  if not acquired_immediately and _lock_retry_task is None:
223
- # Failed initial attempt, start background retry task
224
186
  loop = asyncio.get_running_loop()
225
187
  _lock_retry_task = loop.create_task(_background_lock_retry_loop(server))
226
188
 
@@ -232,48 +194,40 @@ async def shutdown_scheduler_and_release_lock():
232
194
  """
233
195
  global _is_scheduler_leader, _lock_retry_task, scheduler
234
196
 
235
- # 1. Cancel retry task if running (for non-leaders)
236
197
  if _lock_retry_task is not None:
237
198
  logger.info("Shutting down: Cancelling background lock retry task.")
238
199
  current_task = _lock_retry_task
239
- _lock_retry_task = None # Clear handle first
200
+ _lock_retry_task = None
240
201
  current_task.cancel()
241
202
  try:
242
- await current_task # Wait for cancellation
203
+ await current_task
243
204
  except asyncio.CancelledError:
244
205
  logger.info("Background lock retry task successfully cancelled.")
245
206
  except Exception as e:
246
207
  logger.warning(f"Exception waiting for cancelled retry task: {e}", exc_info=True)
247
208
 
248
- # 2. Shutdown scheduler and release lock if we were the leader
249
209
  if _is_scheduler_leader:
250
210
  logger.info("Shutting down: Leader instance stopping scheduler and releasing lock.")
251
211
  if scheduler.running:
252
212
  try:
253
- # Force synchronous shutdown to prevent callback scheduling
254
213
  scheduler.shutdown(wait=True)
255
214
 
256
- # wait for any internal cleanup to complete
257
215
  await asyncio.sleep(0.1)
258
216
 
259
217
  logger.info("APScheduler shut down.")
260
218
  except Exception as e:
261
- # Handle SchedulerNotRunningError and other shutdown exceptions
262
219
  logger.warning(f"Exception during APScheduler shutdown: {e}")
263
220
  if "not running" not in str(e).lower():
264
221
  logger.error(f"Unexpected error shutting down APScheduler: {e}", exc_info=True)
265
222
 
266
223
  await _release_advisory_lock()
267
- _is_scheduler_leader = False # Update state after cleanup
224
+ _is_scheduler_leader = False
268
225
  else:
269
226
  logger.info("Shutting down: Non-leader instance.")
270
227
 
271
- # Final cleanup check for scheduler state (belt and suspenders)
272
- # This should rarely be needed if shutdown logic above worked correctly
273
228
  try:
274
229
  if scheduler.running:
275
230
  logger.warning("Scheduler still running after shutdown logic completed? Forcing shutdown.")
276
231
  scheduler.shutdown(wait=False)
277
232
  except Exception as e:
278
- # Catch SchedulerNotRunningError and other shutdown exceptions
279
233
  logger.debug(f"Expected exception during final scheduler cleanup: {e}")
@@ -0,0 +1,32 @@
1
+ from typing import List, Optional
2
+
3
+ from pydantic import Field
4
+
5
+ from letta.schemas.letta_base import LettaBase
6
+
7
+
8
+ class FileStats(LettaBase):
9
+ """File statistics for metadata endpoint"""
10
+
11
+ file_id: str = Field(..., description="Unique identifier of the file")
12
+ file_name: str = Field(..., description="Name of the file")
13
+ file_size: Optional[int] = Field(None, description="Size of the file in bytes")
14
+
15
+
16
+ class SourceStats(LettaBase):
17
+ """Aggregated metadata for a source"""
18
+
19
+ source_id: str = Field(..., description="Unique identifier of the source")
20
+ source_name: str = Field(..., description="Name of the source")
21
+ file_count: int = Field(0, description="Number of files in the source")
22
+ total_size: int = Field(0, description="Total size of all files in bytes")
23
+ files: List[FileStats] = Field(default_factory=list, description="List of file statistics")
24
+
25
+
26
+ class OrganizationSourcesStats(LettaBase):
27
+ """Complete metadata response for organization sources"""
28
+
29
+ total_sources: int = Field(0, description="Total number of sources")
30
+ total_files: int = Field(0, description="Total number of files across all sources")
31
+ total_size: int = Field(0, description="Total size of all files in bytes")
32
+ sources: List[SourceStats] = Field(default_factory=list, description="List of source metadata")
@@ -226,6 +226,32 @@ class DatabaseRegistry:
226
226
  @contextmanager
227
227
  def session(self, name: str = "default") -> Generator[Any, None, None]:
228
228
  """Context manager for database sessions."""
229
+ caller_info = "unknown caller"
230
+ try:
231
+ import inspect
232
+
233
+ frame = inspect.currentframe()
234
+ stack = inspect.getouterframes(frame)
235
+
236
+ for i, frame_info in enumerate(stack):
237
+ module = inspect.getmodule(frame_info.frame)
238
+ module_name = module.__name__ if module else "unknown"
239
+
240
+ if module_name != "contextlib" and "db.py" not in frame_info.filename:
241
+ caller_module = module_name
242
+ caller_function = frame_info.function
243
+ caller_lineno = frame_info.lineno
244
+ caller_file = frame_info.filename.split("/")[-1]
245
+
246
+ caller_info = f"{caller_module}.{caller_function}:{caller_lineno} ({caller_file})"
247
+ break
248
+ except:
249
+ pass
250
+ finally:
251
+ del frame
252
+
253
+ self.session_caller_trace(caller_info)
254
+
229
255
  session_factory = self.get_session_factory(name)
230
256
  if not session_factory:
231
257
  raise ValueError(f"No session factory found for '{name}'")
@@ -250,6 +276,11 @@ class DatabaseRegistry:
250
276
  finally:
251
277
  await session.close()
252
278
 
279
+ @trace_method
280
+ def session_caller_trace(self, caller_info: str):
281
+ """Trace sync db caller information for debugging purposes."""
282
+ pass # wrapper used for otel tracing only
283
+
253
284
 
254
285
  # Create a singleton instance
255
286
  db_registry = DatabaseRegistry()
@@ -23,10 +23,10 @@ from letta.schemas.enums import FileProcessingStatus
23
23
  from letta.schemas.file import FileMetadata
24
24
  from letta.schemas.passage import Passage
25
25
  from letta.schemas.source import Source, SourceCreate, SourceUpdate
26
+ from letta.schemas.source_metadata import OrganizationSourcesStats
26
27
  from letta.schemas.user import User
27
28
  from letta.server.rest_api.utils import get_letta_server
28
29
  from letta.server.server import SyncServer
29
- from letta.services.file_processor.chunker.llama_index_chunker import LlamaIndexChunker
30
30
  from letta.services.file_processor.embedder.openai_embedder import OpenAIEmbedder
31
31
  from letta.services.file_processor.embedder.pinecone_embedder import PineconeEmbedder
32
32
  from letta.services.file_processor.file_processor import FileProcessor
@@ -95,6 +95,24 @@ async def get_source_id_by_name(
95
95
  return source.id
96
96
 
97
97
 
98
+ @router.get("/metadata", response_model=OrganizationSourcesStats, operation_id="get_sources_metadata")
99
+ async def get_sources_metadata(
100
+ server: "SyncServer" = Depends(get_letta_server),
101
+ actor_id: Optional[str] = Header(None, alias="user_id"),
102
+ ):
103
+ """
104
+ Get aggregated metadata for all sources in an organization.
105
+
106
+ Returns structured metadata including:
107
+ - Total number of sources
108
+ - Total number of files across all sources
109
+ - Total size of all files
110
+ - Per-source breakdown with file details (file_name, file_size per file)
111
+ """
112
+ actor = await server.user_manager.get_actor_or_default_async(actor_id=actor_id)
113
+ return await server.file_manager.get_organization_sources_metadata(actor=actor)
114
+
115
+
98
116
  @router.get("/", response_model=List[Source], operation_id="list_sources")
99
117
  async def list_sources(
100
118
  server: "SyncServer" = Depends(get_letta_server),
@@ -344,7 +362,9 @@ async def get_file_metadata(
344
362
 
345
363
  if should_use_pinecone() and not file_metadata.is_processing_terminal():
346
364
  ids = await list_pinecone_index_for_files(file_id=file_id, actor=actor, limit=file_metadata.total_chunks)
347
- logger.info(f"Embedded chunks {len(ids)}/{file_metadata.total_chunks} for {file_id} in organization {actor.organization_id}")
365
+ logger.info(
366
+ f"Embedded chunks {len(ids)}/{file_metadata.total_chunks} for {file_id} ({file_metadata.file_name}) in organization {actor.organization_id}"
367
+ )
348
368
 
349
369
  if len(ids) != file_metadata.chunks_embedded or len(ids) == file_metadata.total_chunks:
350
370
  if len(ids) != file_metadata.total_chunks:
@@ -424,15 +444,12 @@ async def load_file_to_source_cloud(
424
444
  file_metadata: FileMetadata,
425
445
  ):
426
446
  file_processor = MistralFileParser()
427
- text_chunker = LlamaIndexChunker(chunk_size=embedding_config.embedding_chunk_size)
428
447
  using_pinecone = should_use_pinecone()
429
448
  if using_pinecone:
430
449
  embedder = PineconeEmbedder()
431
450
  else:
432
451
  embedder = OpenAIEmbedder(embedding_config=embedding_config)
433
- file_processor = FileProcessor(
434
- file_parser=file_processor, text_chunker=text_chunker, embedder=embedder, actor=actor, using_pinecone=using_pinecone
435
- )
452
+ file_processor = FileProcessor(file_parser=file_processor, embedder=embedder, actor=actor, using_pinecone=using_pinecone)
436
453
  await file_processor.process(
437
454
  server=server, agent_states=agent_states, source_id=source_id, content=content, file_metadata=file_metadata
438
455
  )
@@ -16,6 +16,7 @@ from letta.otel.tracing import trace_method
16
16
  from letta.schemas.enums import FileProcessingStatus
17
17
  from letta.schemas.file import FileMetadata as PydanticFileMetadata
18
18
  from letta.schemas.source import Source as PydanticSource
19
+ from letta.schemas.source_metadata import FileStats, OrganizationSourcesStats, SourceStats
19
20
  from letta.schemas.user import User as PydanticUser
20
21
  from letta.server.db import db_registry
21
22
  from letta.utils import enforce_types
@@ -272,3 +273,72 @@ class FileManager:
272
273
  else:
273
274
  # Add numeric suffix
274
275
  return f"{source.name}/{base}_({count}){ext}"
276
+
277
+ @enforce_types
278
+ @trace_method
279
+ async def get_organization_sources_metadata(self, actor: PydanticUser) -> OrganizationSourcesStats:
280
+ """
281
+ Get aggregated metadata for all sources in an organization with optimized queries.
282
+
283
+ Returns structured metadata including:
284
+ - Total number of sources
285
+ - Total number of files across all sources
286
+ - Total size of all files
287
+ - Per-source breakdown with file details
288
+ """
289
+ async with db_registry.async_session() as session:
290
+ # Import here to avoid circular imports
291
+ from letta.orm.source import Source as SourceModel
292
+
293
+ # Single optimized query to get all sources with their file aggregations
294
+ query = (
295
+ select(
296
+ SourceModel.id,
297
+ SourceModel.name,
298
+ func.count(FileMetadataModel.id).label("file_count"),
299
+ func.coalesce(func.sum(FileMetadataModel.file_size), 0).label("total_size"),
300
+ )
301
+ .outerjoin(FileMetadataModel, (FileMetadataModel.source_id == SourceModel.id) & (FileMetadataModel.is_deleted == False))
302
+ .where(SourceModel.organization_id == actor.organization_id)
303
+ .where(SourceModel.is_deleted == False)
304
+ .group_by(SourceModel.id, SourceModel.name)
305
+ .order_by(SourceModel.name)
306
+ )
307
+
308
+ result = await session.execute(query)
309
+ source_aggregations = result.fetchall()
310
+
311
+ # Build response
312
+ metadata = OrganizationSourcesStats()
313
+
314
+ for row in source_aggregations:
315
+ source_id, source_name, file_count, total_size = row
316
+
317
+ # Get individual file details for this source
318
+ files_query = (
319
+ select(FileMetadataModel.id, FileMetadataModel.file_name, FileMetadataModel.file_size)
320
+ .where(
321
+ FileMetadataModel.source_id == source_id,
322
+ FileMetadataModel.organization_id == actor.organization_id,
323
+ FileMetadataModel.is_deleted == False,
324
+ )
325
+ .order_by(FileMetadataModel.file_name)
326
+ )
327
+
328
+ files_result = await session.execute(files_query)
329
+ files_rows = files_result.fetchall()
330
+
331
+ # Build file stats
332
+ files = [FileStats(file_id=file_row[0], file_name=file_row[1], file_size=file_row[2]) for file_row in files_rows]
333
+
334
+ # Build source metadata
335
+ source_metadata = SourceStats(
336
+ source_id=source_id, source_name=source_name, file_count=file_count, total_size=total_size, files=files
337
+ )
338
+
339
+ metadata.sources.append(source_metadata)
340
+ metadata.total_files += file_count
341
+ metadata.total_size += total_size
342
+
343
+ metadata.total_sources = len(metadata.sources)
344
+ return metadata
@@ -99,7 +99,12 @@ class LineChunker:
99
99
  return [line for line in lines if line.strip()]
100
100
 
101
101
  def chunk_text(
102
- self, file_metadata: FileMetadata, start: Optional[int] = None, end: Optional[int] = None, add_metadata: bool = True
102
+ self,
103
+ file_metadata: FileMetadata,
104
+ start: Optional[int] = None,
105
+ end: Optional[int] = None,
106
+ add_metadata: bool = True,
107
+ validate_range: bool = False,
103
108
  ) -> List[str]:
104
109
  """Content-aware text chunking based on file type"""
105
110
  strategy = self._determine_chunking_strategy(file_metadata)
@@ -116,11 +121,31 @@ class LineChunker:
116
121
  content_lines = self._chunk_by_lines(text, preserve_indentation=False)
117
122
 
118
123
  total_chunks = len(content_lines)
124
+ chunk_type = (
125
+ "sentences" if strategy == ChunkingStrategy.DOCUMENTATION else "chunks" if strategy == ChunkingStrategy.PROSE else "lines"
126
+ )
127
+
128
+ # Validate range if requested
129
+ if validate_range and (start is not None or end is not None):
130
+ if start is not None and start >= total_chunks:
131
+ # Convert to 1-indexed for user-friendly error message
132
+ start_display = start + 1
133
+ raise ValueError(
134
+ f"File {file_metadata.file_name} has only {total_chunks} lines, but requested offset {start_display} is out of range"
135
+ )
136
+
137
+ if start is not None and end is not None and end > total_chunks:
138
+ # Convert to 1-indexed for user-friendly error message
139
+ start_display = start + 1
140
+ end_display = end
141
+ raise ValueError(
142
+ f"File {file_metadata.file_name} has only {total_chunks} lines, but requested range {start_display} to {end_display} extends beyond file bounds"
143
+ )
119
144
 
120
145
  # Handle start/end slicing
121
- if start is not None and end is not None:
146
+ if start is not None or end is not None:
122
147
  content_lines = content_lines[start:end]
123
- line_offset = start
148
+ line_offset = start if start is not None else 0
124
149
  else:
125
150
  line_offset = 0
126
151
 
@@ -129,14 +154,15 @@ class LineChunker:
129
154
 
130
155
  # Add metadata about total chunks
131
156
  if add_metadata:
132
- chunk_type = (
133
- "sentences" if strategy == ChunkingStrategy.DOCUMENTATION else "chunks" if strategy == ChunkingStrategy.PROSE else "lines"
134
- )
135
157
  if start is not None and end is not None:
136
158
  # Display 1-indexed ranges for users
137
159
  start_display = start + 1
138
160
  end_display = end
139
161
  content_lines.insert(0, f"[Viewing {chunk_type} {start_display} to {end_display} (out of {total_chunks} {chunk_type})]")
162
+ elif start is not None:
163
+ # Only start specified - viewing from start to end
164
+ start_display = start + 1
165
+ content_lines.insert(0, f"[Viewing {chunk_type} {start_display} to end (out of {total_chunks} {chunk_type})]")
140
166
  else:
141
167
  content_lines.insert(0, f"[Viewing file start (out of {total_chunks} {chunk_type})]")
142
168