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.
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/PKG-INFO +1 -1
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/__init__.py +1 -1
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/constants.py +1 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/pinecone_utils.py +12 -2
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/jobs/scheduler.py +45 -91
- letta_nightly-0.8.11.dev20250708000504/letta/schemas/source_metadata.py +32 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/db.py +31 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/sources.py +23 -6
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_manager.py +70 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/chunker/line_chunker.py +32 -6
- letta_nightly-0.8.11.dev20250708000504/letta/services/file_processor/chunker/llama_index_chunker.py +169 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/embedder/openai_embedder.py +1 -1
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/file_processor.py +59 -15
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/files_tool_executor.py +1 -1
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/settings.py +1 -1
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/pyproject.toml +1 -1
- letta_nightly-0.8.10.dev20250707035305/letta/services/file_processor/chunker/llama_index_chunker.py +0 -119
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/LICENSE +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/README.md +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agent.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/base_agent.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/ephemeral_agent.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/ephemeral_summary_agent.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/exceptions.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/helpers.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/letta_agent.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/letta_agent_batch.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/voice_agent.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/agents/voice_sleeptime_agent.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/cli/cli.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/cli/cli_load.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/client/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/client/client.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/client/streaming.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/client/utils.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/config.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/data_sources/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/data_sources/connectors.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/data_sources/connectors_helper.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/data_sources/redis_client.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/embeddings.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/errors.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/ast_parsers.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/async_composio_toolset.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/composio_helpers.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/function_sets/base.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/function_sets/builtin.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/function_sets/extras.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/function_sets/files.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/function_sets/multi_agent.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/function_sets/voice.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/functions.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/helpers.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/interface.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/mcp_client/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/mcp_client/base_client.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/mcp_client/exceptions.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/mcp_client/sse_client.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/mcp_client/stdio_client.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/mcp_client/types.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/prompts.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/schema_generator.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/functions/types.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/groups/dynamic_multi_agent.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/groups/helpers.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/groups/round_robin_multi_agent.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/groups/sleeptime_multi_agent.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/groups/sleeptime_multi_agent_v2.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/groups/supervisor_multi_agent.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/composio_helpers.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/converters.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/datetime_helpers.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/decorators.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/json_helpers.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/message_helper.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/singleton.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/tool_execution_helper.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/helpers/tool_rule_solver.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/humans/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/humans/examples/basic.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/humans/examples/cs_phd.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/interface.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/interfaces/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/interfaces/anthropic_streaming_interface.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/interfaces/openai_chat_completions_streaming_interface.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/interfaces/openai_streaming_interface.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/interfaces/utils.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/jobs/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/jobs/helpers.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/jobs/llm_batch_job_polling.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/jobs/types.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/anthropic.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/anthropic_client.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/aws_bedrock.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/azure_openai.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/azure_openai_constants.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/bedrock_client.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/cohere.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/deepseek.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/google_ai_client.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/google_constants.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/google_vertex_client.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/helpers.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/llm_api_tools.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/llm_client.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/llm_client_base.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/mistral.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/openai.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/llm_api/openai_client.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/README.md +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/chat_completion_proxy.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/constants.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/function_parser.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/grammars/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/grammars/gbnf_grammar_generator.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/grammars/json.gbnf +0 -0
- {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
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/json_parser.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/koboldcpp/api.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/koboldcpp/settings.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llamacpp/api.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llamacpp/settings.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/airoboros.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/chatml.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/dolphin.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/llama3.py +0 -0
- {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
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/wrapper_base.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/llm_chat_completion_wrappers/zephyr.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/lmstudio/api.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/lmstudio/settings.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/ollama/api.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/ollama/settings.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/settings/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/settings/deterministic_mirostat.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/settings/settings.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/settings/simple.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/utils.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/vllm/api.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/webui/api.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/webui/legacy_api.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/webui/legacy_settings.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/local_llm/webui/settings.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/log.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/main.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/memory.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/openai_backcompat/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/openai_backcompat/openai_object.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/__all__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/agent.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/agents_tags.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/base.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/block.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/block_history.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/blocks_agents.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/custom_columns.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/enums.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/errors.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/file.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/files_agents.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/group.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/groups_agents.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/groups_blocks.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/identities_agents.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/identities_blocks.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/identity.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/job.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/job_messages.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/llm_batch_items.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/llm_batch_job.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/mcp_server.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/message.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/mixins.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/organization.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/passage.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/provider.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/provider_trace.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/sandbox_config.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/source.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/sources_agents.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/sqlalchemy_base.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/sqlite_functions.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/step.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/tool.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/tools_agents.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/orm/user.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/otel/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/otel/context.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/otel/events.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/otel/metric_registry.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/otel/metrics.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/otel/resource.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/otel/tracing.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/anna_pa.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/google_search_persona.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/memgpt_doc.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/memgpt_starter.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/o1_persona.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/sam.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/sam_pov.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/sam_simple_pov_gpt35.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/sleeptime_doc_persona.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/sleeptime_memory_persona.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/sqldb/test.db +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/personas/examples/voice_memory_persona.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/plugins/README.md +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/plugins/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/plugins/defaults.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/plugins/plugins.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/gpt_summarize.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/gpt_system.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_base.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_chat.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_chat_compressed.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_chat_fstring.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_convo_only.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_doc.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_gpt35_extralong.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_intuitive_knowledge.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_memory_only.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_modified_chat.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_modified_o1.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_offline_memory.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_offline_memory_chat.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_sleeptime_chat.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/memgpt_v2_chat.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/react.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/sleeptime.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/sleeptime_doc_ingest.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/sleeptime_v2.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/summary_system_prompt.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/voice_chat.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/voice_sleeptime.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/prompts/system/workflow.txt +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/pytest.ini +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/agent.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/block.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/embedding_config.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/embedding_config_overrides.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/enums.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/environment_variables.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/file.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/group.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/health.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/identity.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/job.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/letta_base.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/letta_message.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/letta_message_content.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/letta_request.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/letta_response.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/letta_stop_reason.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/llm_batch_job.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/llm_config.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/llm_config_overrides.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/mcp.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/memory.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/message.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/openai/chat_completion_request.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/openai/chat_completion_response.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/openai/chat_completions.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/openai/embedding_response.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/openai/openai.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/organization.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/passage.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/pip_requirement.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/provider_trace.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/providers.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/response_format.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/run.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/sandbox_config.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/source.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/step.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/tool.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/tool_execution_result.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/tool_rule.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/usage.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/schemas/user.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/marshmallow_agent.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/marshmallow_agent_environment_variable.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/marshmallow_base.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/marshmallow_block.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/marshmallow_custom_fields.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/marshmallow_message.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/marshmallow_tag.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/marshmallow_tool.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/serialize_schemas/pydantic_agent_schema.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/constants.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/generate_openapi_schema.sh +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/app.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/auth/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/auth/index.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/auth_token.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/chat_completions_interface.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/interface.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/json_parser.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/openai/chat_completions/__init__.py +0 -0
- {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
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/agents.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/blocks.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/embeddings.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/groups.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/health.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/identities.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/jobs.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/llms.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/messages.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/organizations.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/providers.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/runs.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/sandbox_configs.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/steps.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/tags.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/telemetry.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/tools.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/users.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/routers/v1/voice.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/static_files.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/streaming_response.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/rest_api/utils.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/server.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/startup.sh +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/static_files/assets/index-048c9598.js +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/static_files/assets/index-0e31b727.css +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/static_files/favicon.ico +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/static_files/index.html +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/static_files/memgpt_logo_transparent.png +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/utils.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/ws_api/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/ws_api/example_client.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/ws_api/interface.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/ws_api/protocol.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/ws_api/server.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/agent_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/block_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/context_window_calculator/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/context_window_calculator/context_window_calculator.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/context_window_calculator/token_counter.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/chunker/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/embedder/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/embedder/base_embedder.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/embedder/pinecone_embedder.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/file_types.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/parser/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/parser/base_parser.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/parser/mistral_parser.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/file_processor/types.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/files_agents_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/group_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/helpers/agent_manager_helper.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/helpers/tool_execution_helper.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/helpers/tool_parser_helper.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/identity_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/job_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/llm_batch_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/mcp/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/mcp/base_client.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/mcp/sse_client.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/mcp/stdio_client.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/mcp/streamable_http_client.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/mcp/types.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/mcp_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/message_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/organization_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/passage_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/per_agent_lock_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/provider_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/sandbox_config_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/source_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/step_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/summarizer/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/summarizer/enums.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/summarizer/summarizer.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/telemetry_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/builtin_tool_executor.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/composio_tool_executor.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/core_tool_executor.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/mcp_tool_executor.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/multi_agent_tool_executor.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/tool_execution_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/tool_execution_sandbox.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/tool_executor.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_executor/tool_executor_base.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_sandbox/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_sandbox/base.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_sandbox/e2b_sandbox.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/tool_sandbox/local_sandbox.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/services/user_manager.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/streaming_interface.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/streaming_utils.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/system.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/templates/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/templates/sandbox_code_file.py.j2 +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/templates/sandbox_code_file_async.py.j2 +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/templates/summary_request_text.j2 +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/templates/template_helper.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/types/__init__.py +0 -0
- {letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/utils.py +0 -0
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
33
|
-
cur = None
|
|
32
|
+
lock_session = None
|
|
34
33
|
acquired_lock = False
|
|
35
34
|
try:
|
|
36
|
-
|
|
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
|
|
41
|
+
acquired_lock = True
|
|
45
42
|
else:
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
|
55
|
-
|
|
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
|
-
|
|
65
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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,
|
|
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:
|
|
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:
|
|
89
|
+
if acquired_lock:
|
|
103
90
|
logger.warning("Attempting to release lock due to error during startup.")
|
|
104
91
|
try:
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
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
|
|
104
|
+
pass
|
|
123
105
|
return False
|
|
124
106
|
finally:
|
|
125
|
-
|
|
126
|
-
if cur:
|
|
127
|
-
try:
|
|
128
|
-
cur.close()
|
|
129
|
-
except:
|
|
130
|
-
pass
|
|
131
|
-
if raw_conn:
|
|
107
|
+
if lock_session:
|
|
132
108
|
try:
|
|
133
|
-
|
|
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:
|
|
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
|
|
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
|
|
158
|
-
break
|
|
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
|
|
171
|
-
global
|
|
144
|
+
"""Releases the advisory lock using the stored session."""
|
|
145
|
+
global _advisory_lock_session
|
|
172
146
|
|
|
173
|
-
|
|
174
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
197
|
-
|
|
198
|
-
logger.info("Closed database
|
|
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
|
|
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
|
|
200
|
+
_lock_retry_task = None
|
|
240
201
|
current_task.cancel()
|
|
241
202
|
try:
|
|
242
|
-
await current_task
|
|
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
|
|
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")
|
{letta_nightly-0.8.10.dev20250707035305 → letta_nightly-0.8.11.dev20250708000504}/letta/server/db.py
RENAMED
|
@@ -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(
|
|
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,
|
|
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
|
|
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
|
|