letta-nightly 0.8.13.dev20250714104447__tar.gz → 0.8.14.dev20250714180504__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.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/PKG-INFO +1 -1
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/__init__.py +1 -1
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/constants.py +6 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/function_sets/base.py +2 -2
- letta_nightly-0.8.14.dev20250714180504/letta/helpers/pinecone_utils.py +333 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/file.py +2 -17
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/files_agents.py +9 -10
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/organization.py +0 -4
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/passage.py +0 -10
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/source.py +3 -20
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/file.py +1 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/memory.py +2 -2
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/agents.py +4 -4
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/messages.py +2 -6
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/sources.py +3 -3
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/server.py +0 -3
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/agent_manager.py +194 -147
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/context_window_calculator/context_window_calculator.py +15 -10
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/context_window_calculator/token_counter.py +40 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/file_processor/chunker/line_chunker.py +17 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/file_processor/embedder/openai_embedder.py +50 -5
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/files_agents_manager.py +12 -2
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/source_manager.py +19 -3
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/tool_executor/core_tool_executor.py +2 -2
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/tool_executor/files_tool_executor.py +6 -1
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/pyproject.toml +1 -2
- letta_nightly-0.8.13.dev20250714104447/letta/helpers/pinecone_utils.py +0 -180
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/LICENSE +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/README.md +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/agent.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/agents/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/agents/base_agent.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/agents/ephemeral_agent.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/agents/ephemeral_summary_agent.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/agents/exceptions.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/agents/helpers.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/agents/letta_agent.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/agents/letta_agent_batch.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/agents/voice_agent.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/agents/voice_sleeptime_agent.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/cli/cli.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/cli/cli_load.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/client/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/client/client.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/client/streaming.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/client/utils.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/config.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/data_sources/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/data_sources/connectors.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/data_sources/connectors_helper.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/data_sources/redis_client.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/embeddings.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/errors.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/ast_parsers.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/async_composio_toolset.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/composio_helpers.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/function_sets/builtin.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/function_sets/extras.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/function_sets/files.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/function_sets/multi_agent.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/function_sets/voice.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/functions.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/helpers.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/interface.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/mcp_client/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/mcp_client/base_client.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/mcp_client/exceptions.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/mcp_client/sse_client.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/mcp_client/stdio_client.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/mcp_client/types.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/prompts.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/schema_generator.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/functions/types.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/groups/dynamic_multi_agent.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/groups/helpers.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/groups/round_robin_multi_agent.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/groups/sleeptime_multi_agent.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/groups/sleeptime_multi_agent_v2.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/groups/supervisor_multi_agent.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/helpers/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/helpers/composio_helpers.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/helpers/converters.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/helpers/datetime_helpers.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/helpers/decorators.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/helpers/json_helpers.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/helpers/message_helper.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/helpers/singleton.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/helpers/tool_execution_helper.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/helpers/tool_rule_solver.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/humans/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/humans/examples/basic.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/humans/examples/cs_phd.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/interface.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/interfaces/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/interfaces/anthropic_streaming_interface.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/interfaces/openai_chat_completions_streaming_interface.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/interfaces/openai_streaming_interface.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/interfaces/utils.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/jobs/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/jobs/helpers.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/jobs/llm_batch_job_polling.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/jobs/scheduler.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/jobs/types.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/anthropic.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/anthropic_client.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/aws_bedrock.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/azure_openai.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/azure_openai_constants.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/bedrock_client.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/cohere.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/deepseek.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/google_ai_client.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/google_constants.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/google_vertex_client.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/helpers.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/llm_api_tools.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/llm_client.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/llm_client_base.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/mistral.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/openai.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/llm_api/openai_client.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/README.md +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/chat_completion_proxy.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/constants.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/function_parser.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/grammars/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/grammars/gbnf_grammar_generator.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/grammars/json.gbnf +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/grammars/json_func_calls_with_inner_thoughts.gbnf +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/json_parser.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/koboldcpp/api.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/koboldcpp/settings.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/llamacpp/api.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/llamacpp/settings.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/llm_chat_completion_wrappers/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/llm_chat_completion_wrappers/airoboros.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/llm_chat_completion_wrappers/chatml.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/llm_chat_completion_wrappers/dolphin.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/llm_chat_completion_wrappers/llama3.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/llm_chat_completion_wrappers/simple_summary_wrapper.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/llm_chat_completion_wrappers/wrapper_base.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/llm_chat_completion_wrappers/zephyr.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/lmstudio/api.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/lmstudio/settings.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/ollama/api.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/ollama/settings.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/settings/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/settings/deterministic_mirostat.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/settings/settings.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/settings/simple.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/utils.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/vllm/api.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/webui/api.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/webui/legacy_api.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/webui/legacy_settings.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/local_llm/webui/settings.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/log.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/main.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/memory.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/openai_backcompat/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/openai_backcompat/openai_object.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/__all__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/agent.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/agents_tags.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/base.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/block.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/block_history.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/blocks_agents.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/custom_columns.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/enums.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/errors.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/group.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/groups_agents.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/groups_blocks.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/identities_agents.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/identities_blocks.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/identity.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/job.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/job_messages.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/llm_batch_items.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/llm_batch_job.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/mcp_server.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/message.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/mixins.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/provider.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/provider_trace.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/sandbox_config.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/sources_agents.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/sqlalchemy_base.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/sqlite_functions.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/step.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/tool.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/tools_agents.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/user.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/otel/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/otel/context.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/otel/events.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/otel/metric_registry.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/otel/metrics.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/otel/resource.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/otel/tracing.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/personas/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/personas/examples/anna_pa.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/personas/examples/google_search_persona.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/personas/examples/memgpt_doc.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/personas/examples/memgpt_starter.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/personas/examples/o1_persona.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/personas/examples/sam.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/personas/examples/sam_pov.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/personas/examples/sam_simple_pov_gpt35.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/personas/examples/sleeptime_doc_persona.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/personas/examples/sleeptime_memory_persona.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/personas/examples/sqldb/test.db +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/personas/examples/voice_memory_persona.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/plugins/README.md +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/plugins/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/plugins/defaults.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/plugins/plugins.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/gpt_summarize.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/gpt_system.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/memgpt_base.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/memgpt_chat.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/memgpt_chat_compressed.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/memgpt_chat_fstring.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/memgpt_convo_only.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/memgpt_doc.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/memgpt_gpt35_extralong.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/memgpt_intuitive_knowledge.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/memgpt_memory_only.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/memgpt_modified_chat.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/memgpt_modified_o1.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/memgpt_offline_memory.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/memgpt_offline_memory_chat.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/memgpt_sleeptime_chat.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/memgpt_v2_chat.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/react.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/sleeptime.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/sleeptime_doc_ingest.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/sleeptime_v2.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/summary_system_prompt.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/voice_chat.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/voice_sleeptime.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/prompts/system/workflow.txt +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/pytest.ini +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/agent.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/block.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/embedding_config.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/embedding_config_overrides.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/enums.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/environment_variables.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/group.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/health.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/identity.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/job.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/letta_base.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/letta_message.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/letta_message_content.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/letta_request.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/letta_response.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/letta_stop_reason.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/llm_batch_job.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/llm_config.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/llm_config_overrides.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/mcp.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/message.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/openai/chat_completion_request.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/openai/chat_completion_response.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/openai/chat_completions.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/openai/embedding_response.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/openai/openai.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/organization.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/passage.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/pip_requirement.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/provider_trace.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/providers.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/response_format.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/run.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/sandbox_config.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/source.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/source_metadata.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/step.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/tool.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/tool_execution_result.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/tool_rule.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/usage.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/schemas/user.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/serialize_schemas/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/serialize_schemas/marshmallow_agent.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/serialize_schemas/marshmallow_agent_environment_variable.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/serialize_schemas/marshmallow_base.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/serialize_schemas/marshmallow_block.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/serialize_schemas/marshmallow_custom_fields.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/serialize_schemas/marshmallow_message.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/serialize_schemas/marshmallow_tag.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/serialize_schemas/marshmallow_tool.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/serialize_schemas/pydantic_agent_schema.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/constants.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/db.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/generate_openapi_schema.sh +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/app.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/auth/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/auth/index.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/auth_token.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/chat_completions_interface.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/interface.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/json_parser.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/openai/chat_completions/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/blocks.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/embeddings.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/groups.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/health.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/identities.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/jobs.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/llms.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/organizations.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/providers.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/runs.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/sandbox_configs.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/steps.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/tags.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/telemetry.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/tools.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/users.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/routers/v1/voice.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/static_files.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/streaming_response.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/rest_api/utils.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/startup.sh +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/static_files/assets/index-048c9598.js +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/static_files/assets/index-0e31b727.css +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/static_files/favicon.ico +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/static_files/index.html +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/static_files/memgpt_logo_transparent.png +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/utils.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/ws_api/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/ws_api/example_client.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/ws_api/interface.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/ws_api/protocol.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/server/ws_api/server.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/block_manager.py +18 -18
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/context_window_calculator/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/file_manager.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/file_processor/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/file_processor/chunker/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/file_processor/chunker/llama_index_chunker.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/file_processor/embedder/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/file_processor/embedder/base_embedder.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/file_processor/embedder/pinecone_embedder.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/file_processor/file_processor.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/file_processor/file_types.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/file_processor/parser/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/file_processor/parser/base_parser.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/file_processor/parser/mistral_parser.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/file_processor/types.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/group_manager.py +11 -11
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/helpers/agent_manager_helper.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/helpers/tool_execution_helper.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/helpers/tool_parser_helper.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/identity_manager.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/job_manager.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/llm_batch_manager.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/mcp/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/mcp/base_client.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/mcp/sse_client.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/mcp/stdio_client.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/mcp/streamable_http_client.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/mcp/types.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/mcp_manager.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/message_manager.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/organization_manager.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/passage_manager.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/per_agent_lock_manager.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/provider_manager.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/sandbox_config_manager.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/step_manager.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/summarizer/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/summarizer/enums.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/summarizer/summarizer.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/telemetry_manager.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/tool_executor/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/tool_executor/builtin_tool_executor.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/tool_executor/composio_tool_executor.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/tool_executor/mcp_tool_executor.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/tool_executor/multi_agent_tool_executor.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/tool_executor/tool_execution_manager.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/tool_executor/tool_execution_sandbox.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/tool_executor/tool_executor.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/tool_executor/tool_executor_base.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/tool_manager.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/tool_sandbox/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/tool_sandbox/base.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/tool_sandbox/e2b_sandbox.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/tool_sandbox/local_sandbox.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/services/user_manager.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/settings.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/streaming_interface.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/streaming_utils.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/system.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/templates/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/templates/sandbox_code_file.py.j2 +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/templates/sandbox_code_file_async.py.j2 +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/templates/summary_request_text.j2 +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/templates/template_helper.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/types/__init__.py +0 -0
- {letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/utils.py +0 -0
{letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/constants.py
RENAMED
|
@@ -372,3 +372,9 @@ PINECONE_METRIC = "cosine"
|
|
|
372
372
|
PINECONE_CLOUD = "aws"
|
|
373
373
|
PINECONE_REGION = "us-east-1"
|
|
374
374
|
PINECONE_MAX_BATCH_SIZE = 96
|
|
375
|
+
|
|
376
|
+
# retry configuration
|
|
377
|
+
PINECONE_MAX_RETRY_ATTEMPTS = 3
|
|
378
|
+
PINECONE_RETRY_BASE_DELAY = 1.0 # seconds
|
|
379
|
+
PINECONE_RETRY_MAX_DELAY = 60.0 # seconds
|
|
380
|
+
PINECONE_RETRY_BACKOFF_FACTOR = 2.0
|
|
@@ -135,7 +135,7 @@ def core_memory_append(agent_state: "AgentState", label: str, content: str) -> O
|
|
|
135
135
|
Append to the contents of core memory.
|
|
136
136
|
|
|
137
137
|
Args:
|
|
138
|
-
label (str): Section of the memory to be edited
|
|
138
|
+
label (str): Section of the memory to be edited.
|
|
139
139
|
content (str): Content to write to the memory. All unicode (including emojis) are supported.
|
|
140
140
|
|
|
141
141
|
Returns:
|
|
@@ -152,7 +152,7 @@ def core_memory_replace(agent_state: "AgentState", label: str, old_content: str,
|
|
|
152
152
|
Replace the contents of core memory. To delete memories, use an empty string for new_content.
|
|
153
153
|
|
|
154
154
|
Args:
|
|
155
|
-
label (str): Section of the memory to be edited
|
|
155
|
+
label (str): Section of the memory to be edited.
|
|
156
156
|
old_content (str): String to replace. Must be an exact match.
|
|
157
157
|
new_content (str): Content to write to the memory. All unicode (including emojis) are supported.
|
|
158
158
|
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import random
|
|
3
|
+
import time
|
|
4
|
+
from functools import wraps
|
|
5
|
+
from typing import Any, Dict, List
|
|
6
|
+
|
|
7
|
+
from letta.otel.tracing import trace_method
|
|
8
|
+
|
|
9
|
+
try:
|
|
10
|
+
from pinecone import IndexEmbed, PineconeAsyncio
|
|
11
|
+
from pinecone.exceptions.exceptions import (
|
|
12
|
+
ForbiddenException,
|
|
13
|
+
NotFoundException,
|
|
14
|
+
PineconeApiException,
|
|
15
|
+
ServiceException,
|
|
16
|
+
UnauthorizedException,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
PINECONE_AVAILABLE = True
|
|
20
|
+
except ImportError:
|
|
21
|
+
PINECONE_AVAILABLE = False
|
|
22
|
+
|
|
23
|
+
from letta.constants import (
|
|
24
|
+
PINECONE_CLOUD,
|
|
25
|
+
PINECONE_EMBEDDING_MODEL,
|
|
26
|
+
PINECONE_MAX_BATCH_SIZE,
|
|
27
|
+
PINECONE_MAX_RETRY_ATTEMPTS,
|
|
28
|
+
PINECONE_METRIC,
|
|
29
|
+
PINECONE_REGION,
|
|
30
|
+
PINECONE_RETRY_BACKOFF_FACTOR,
|
|
31
|
+
PINECONE_RETRY_BASE_DELAY,
|
|
32
|
+
PINECONE_RETRY_MAX_DELAY,
|
|
33
|
+
PINECONE_TEXT_FIELD_NAME,
|
|
34
|
+
)
|
|
35
|
+
from letta.log import get_logger
|
|
36
|
+
from letta.schemas.user import User
|
|
37
|
+
from letta.settings import settings
|
|
38
|
+
|
|
39
|
+
logger = get_logger(__name__)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def pinecone_retry(
|
|
43
|
+
max_attempts: int = PINECONE_MAX_RETRY_ATTEMPTS,
|
|
44
|
+
base_delay: float = PINECONE_RETRY_BASE_DELAY,
|
|
45
|
+
max_delay: float = PINECONE_RETRY_MAX_DELAY,
|
|
46
|
+
backoff_factor: float = PINECONE_RETRY_BACKOFF_FACTOR,
|
|
47
|
+
):
|
|
48
|
+
"""
|
|
49
|
+
Decorator to retry Pinecone operations with exponential backoff.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
max_attempts: Maximum number of retry attempts
|
|
53
|
+
base_delay: Base delay in seconds for the first retry
|
|
54
|
+
max_delay: Maximum delay in seconds between retries
|
|
55
|
+
backoff_factor: Factor to increase delay after each failed attempt
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
def decorator(func):
|
|
59
|
+
@wraps(func)
|
|
60
|
+
async def wrapper(*args, **kwargs):
|
|
61
|
+
operation_name = func.__name__
|
|
62
|
+
start_time = time.time()
|
|
63
|
+
|
|
64
|
+
for attempt in range(max_attempts):
|
|
65
|
+
try:
|
|
66
|
+
logger.debug(f"[Pinecone] Starting {operation_name} (attempt {attempt + 1}/{max_attempts})")
|
|
67
|
+
result = await func(*args, **kwargs)
|
|
68
|
+
|
|
69
|
+
execution_time = time.time() - start_time
|
|
70
|
+
logger.info(f"[Pinecone] {operation_name} completed successfully in {execution_time:.2f}s")
|
|
71
|
+
return result
|
|
72
|
+
|
|
73
|
+
except (ServiceException, PineconeApiException) as e:
|
|
74
|
+
# retryable server errors
|
|
75
|
+
if attempt == max_attempts - 1:
|
|
76
|
+
execution_time = time.time() - start_time
|
|
77
|
+
logger.error(f"[Pinecone] {operation_name} failed after {max_attempts} attempts in {execution_time:.2f}s: {str(e)}")
|
|
78
|
+
raise
|
|
79
|
+
|
|
80
|
+
# calculate delay with exponential backoff and jitter
|
|
81
|
+
delay = min(base_delay * (backoff_factor**attempt), max_delay)
|
|
82
|
+
jitter = random.uniform(0, delay * 0.1) # add up to 10% jitter
|
|
83
|
+
total_delay = delay + jitter
|
|
84
|
+
|
|
85
|
+
logger.warning(
|
|
86
|
+
f"[Pinecone] {operation_name} failed (attempt {attempt + 1}/{max_attempts}): {str(e)}. Retrying in {total_delay:.2f}s"
|
|
87
|
+
)
|
|
88
|
+
await asyncio.sleep(total_delay)
|
|
89
|
+
|
|
90
|
+
except (UnauthorizedException, ForbiddenException) as e:
|
|
91
|
+
# non-retryable auth errors
|
|
92
|
+
execution_time = time.time() - start_time
|
|
93
|
+
logger.error(f"[Pinecone] {operation_name} failed with auth error in {execution_time:.2f}s: {str(e)}")
|
|
94
|
+
raise
|
|
95
|
+
|
|
96
|
+
except NotFoundException as e:
|
|
97
|
+
# non-retryable not found errors
|
|
98
|
+
execution_time = time.time() - start_time
|
|
99
|
+
logger.warning(f"[Pinecone] {operation_name} failed with not found error in {execution_time:.2f}s: {str(e)}")
|
|
100
|
+
raise
|
|
101
|
+
|
|
102
|
+
except Exception as e:
|
|
103
|
+
# other unexpected errors - retry once then fail
|
|
104
|
+
if attempt == max_attempts - 1:
|
|
105
|
+
execution_time = time.time() - start_time
|
|
106
|
+
logger.error(f"[Pinecone] {operation_name} failed after {max_attempts} attempts in {execution_time:.2f}s: {str(e)}")
|
|
107
|
+
raise
|
|
108
|
+
|
|
109
|
+
delay = min(base_delay * (backoff_factor**attempt), max_delay)
|
|
110
|
+
jitter = random.uniform(0, delay * 0.1)
|
|
111
|
+
total_delay = delay + jitter
|
|
112
|
+
|
|
113
|
+
logger.warning(
|
|
114
|
+
f"[Pinecone] {operation_name} failed with unexpected error (attempt {attempt + 1}/{max_attempts}): {str(e)}. Retrying in {total_delay:.2f}s"
|
|
115
|
+
)
|
|
116
|
+
await asyncio.sleep(total_delay)
|
|
117
|
+
|
|
118
|
+
return wrapper
|
|
119
|
+
|
|
120
|
+
return decorator
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def should_use_pinecone(verbose: bool = False):
|
|
124
|
+
if verbose:
|
|
125
|
+
logger.info(
|
|
126
|
+
"Pinecone check: enable_pinecone=%s, api_key=%s, agent_index=%s, source_index=%s",
|
|
127
|
+
settings.enable_pinecone,
|
|
128
|
+
bool(settings.pinecone_api_key),
|
|
129
|
+
bool(settings.pinecone_agent_index),
|
|
130
|
+
bool(settings.pinecone_source_index),
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
return all(
|
|
134
|
+
(
|
|
135
|
+
PINECONE_AVAILABLE,
|
|
136
|
+
settings.enable_pinecone,
|
|
137
|
+
settings.pinecone_api_key,
|
|
138
|
+
settings.pinecone_agent_index,
|
|
139
|
+
settings.pinecone_source_index,
|
|
140
|
+
)
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
@pinecone_retry()
|
|
145
|
+
@trace_method
|
|
146
|
+
async def upsert_pinecone_indices():
|
|
147
|
+
if not PINECONE_AVAILABLE:
|
|
148
|
+
raise ImportError("Pinecone is not available. Please install pinecone to use this feature.")
|
|
149
|
+
|
|
150
|
+
indices = get_pinecone_indices()
|
|
151
|
+
logger.info(f"[Pinecone] Upserting {len(indices)} indices: {indices}")
|
|
152
|
+
|
|
153
|
+
for index_name in indices:
|
|
154
|
+
async with PineconeAsyncio(api_key=settings.pinecone_api_key) as pc:
|
|
155
|
+
if not await pc.has_index(index_name):
|
|
156
|
+
logger.info(f"[Pinecone] Creating index {index_name} with model {PINECONE_EMBEDDING_MODEL}")
|
|
157
|
+
await pc.create_index_for_model(
|
|
158
|
+
name=index_name,
|
|
159
|
+
cloud=PINECONE_CLOUD,
|
|
160
|
+
region=PINECONE_REGION,
|
|
161
|
+
embed=IndexEmbed(model=PINECONE_EMBEDDING_MODEL, field_map={"text": PINECONE_TEXT_FIELD_NAME}, metric=PINECONE_METRIC),
|
|
162
|
+
)
|
|
163
|
+
logger.info(f"[Pinecone] Successfully created index {index_name}")
|
|
164
|
+
else:
|
|
165
|
+
logger.debug(f"[Pinecone] Index {index_name} already exists")
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def get_pinecone_indices() -> List[str]:
|
|
169
|
+
return [settings.pinecone_agent_index, settings.pinecone_source_index]
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
@pinecone_retry()
|
|
173
|
+
@trace_method
|
|
174
|
+
async def upsert_file_records_to_pinecone_index(file_id: str, source_id: str, chunks: List[str], actor: User):
|
|
175
|
+
if not PINECONE_AVAILABLE:
|
|
176
|
+
raise ImportError("Pinecone is not available. Please install pinecone to use this feature.")
|
|
177
|
+
|
|
178
|
+
logger.info(f"[Pinecone] Preparing to upsert {len(chunks)} chunks for file {file_id} source {source_id}")
|
|
179
|
+
|
|
180
|
+
records = []
|
|
181
|
+
for i, chunk in enumerate(chunks):
|
|
182
|
+
record = {
|
|
183
|
+
"_id": f"{file_id}_{i}",
|
|
184
|
+
PINECONE_TEXT_FIELD_NAME: chunk,
|
|
185
|
+
"file_id": file_id,
|
|
186
|
+
"source_id": source_id,
|
|
187
|
+
}
|
|
188
|
+
records.append(record)
|
|
189
|
+
|
|
190
|
+
logger.debug(f"[Pinecone] Created {len(records)} records for file {file_id}")
|
|
191
|
+
return await upsert_records_to_pinecone_index(records, actor)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
@pinecone_retry()
|
|
195
|
+
@trace_method
|
|
196
|
+
async def delete_file_records_from_pinecone_index(file_id: str, actor: User):
|
|
197
|
+
if not PINECONE_AVAILABLE:
|
|
198
|
+
raise ImportError("Pinecone is not available. Please install pinecone to use this feature.")
|
|
199
|
+
|
|
200
|
+
namespace = actor.organization_id
|
|
201
|
+
logger.info(f"[Pinecone] Deleting records for file {file_id} from index {settings.pinecone_source_index} namespace {namespace}")
|
|
202
|
+
|
|
203
|
+
try:
|
|
204
|
+
async with PineconeAsyncio(api_key=settings.pinecone_api_key) as pc:
|
|
205
|
+
description = await pc.describe_index(name=settings.pinecone_source_index)
|
|
206
|
+
async with pc.IndexAsyncio(host=description.index.host) as dense_index:
|
|
207
|
+
await dense_index.delete(
|
|
208
|
+
filter={
|
|
209
|
+
"file_id": {"$eq": file_id},
|
|
210
|
+
},
|
|
211
|
+
namespace=namespace,
|
|
212
|
+
)
|
|
213
|
+
logger.info(f"[Pinecone] Successfully deleted records for file {file_id}")
|
|
214
|
+
except NotFoundException:
|
|
215
|
+
logger.warning(f"[Pinecone] Namespace {namespace} not found for file {file_id} and org {actor.organization_id}")
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
@pinecone_retry()
|
|
219
|
+
@trace_method
|
|
220
|
+
async def delete_source_records_from_pinecone_index(source_id: str, actor: User):
|
|
221
|
+
if not PINECONE_AVAILABLE:
|
|
222
|
+
raise ImportError("Pinecone is not available. Please install pinecone to use this feature.")
|
|
223
|
+
|
|
224
|
+
namespace = actor.organization_id
|
|
225
|
+
logger.info(f"[Pinecone] Deleting records for source {source_id} from index {settings.pinecone_source_index} namespace {namespace}")
|
|
226
|
+
|
|
227
|
+
try:
|
|
228
|
+
async with PineconeAsyncio(api_key=settings.pinecone_api_key) as pc:
|
|
229
|
+
description = await pc.describe_index(name=settings.pinecone_source_index)
|
|
230
|
+
async with pc.IndexAsyncio(host=description.index.host) as dense_index:
|
|
231
|
+
await dense_index.delete(filter={"source_id": {"$eq": source_id}}, namespace=namespace)
|
|
232
|
+
logger.info(f"[Pinecone] Successfully deleted records for source {source_id}")
|
|
233
|
+
except NotFoundException:
|
|
234
|
+
logger.warning(f"[Pinecone] Namespace {namespace} not found for source {source_id} and org {actor.organization_id}")
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
@pinecone_retry()
|
|
238
|
+
@trace_method
|
|
239
|
+
async def upsert_records_to_pinecone_index(records: List[dict], actor: User):
|
|
240
|
+
if not PINECONE_AVAILABLE:
|
|
241
|
+
raise ImportError("Pinecone is not available. Please install pinecone to use this feature.")
|
|
242
|
+
|
|
243
|
+
logger.info(f"[Pinecone] Upserting {len(records)} records to index {settings.pinecone_source_index} for org {actor.organization_id}")
|
|
244
|
+
|
|
245
|
+
async with PineconeAsyncio(api_key=settings.pinecone_api_key) as pc:
|
|
246
|
+
description = await pc.describe_index(name=settings.pinecone_source_index)
|
|
247
|
+
async with pc.IndexAsyncio(host=description.index.host) as dense_index:
|
|
248
|
+
# process records in batches to avoid exceeding pinecone limits
|
|
249
|
+
total_batches = (len(records) + PINECONE_MAX_BATCH_SIZE - 1) // PINECONE_MAX_BATCH_SIZE
|
|
250
|
+
logger.debug(f"[Pinecone] Processing {total_batches} batches of max {PINECONE_MAX_BATCH_SIZE} records each")
|
|
251
|
+
|
|
252
|
+
for i in range(0, len(records), PINECONE_MAX_BATCH_SIZE):
|
|
253
|
+
batch = records[i : i + PINECONE_MAX_BATCH_SIZE]
|
|
254
|
+
batch_num = (i // PINECONE_MAX_BATCH_SIZE) + 1
|
|
255
|
+
|
|
256
|
+
logger.debug(f"[Pinecone] Upserting batch {batch_num}/{total_batches} with {len(batch)} records")
|
|
257
|
+
await dense_index.upsert_records(actor.organization_id, batch)
|
|
258
|
+
|
|
259
|
+
logger.info(f"[Pinecone] Successfully upserted all {len(records)} records in {total_batches} batches")
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
@pinecone_retry()
|
|
263
|
+
@trace_method
|
|
264
|
+
async def search_pinecone_index(query: str, limit: int, filter: Dict[str, Any], actor: User) -> Dict[str, Any]:
|
|
265
|
+
if not PINECONE_AVAILABLE:
|
|
266
|
+
raise ImportError("Pinecone is not available. Please install pinecone to use this feature.")
|
|
267
|
+
|
|
268
|
+
namespace = actor.organization_id
|
|
269
|
+
logger.info(
|
|
270
|
+
f"[Pinecone] Searching index {settings.pinecone_source_index} namespace {namespace} with query length {len(query)} chars, limit {limit}"
|
|
271
|
+
)
|
|
272
|
+
logger.debug(f"[Pinecone] Search filter: {filter}")
|
|
273
|
+
|
|
274
|
+
async with PineconeAsyncio(api_key=settings.pinecone_api_key) as pc:
|
|
275
|
+
description = await pc.describe_index(name=settings.pinecone_source_index)
|
|
276
|
+
async with pc.IndexAsyncio(host=description.index.host) as dense_index:
|
|
277
|
+
try:
|
|
278
|
+
# search the dense index with reranking
|
|
279
|
+
search_results = await dense_index.search(
|
|
280
|
+
namespace=namespace,
|
|
281
|
+
query={
|
|
282
|
+
"top_k": limit,
|
|
283
|
+
"inputs": {"text": query},
|
|
284
|
+
"filter": filter,
|
|
285
|
+
},
|
|
286
|
+
rerank={"model": "bge-reranker-v2-m3", "top_n": limit, "rank_fields": [PINECONE_TEXT_FIELD_NAME]},
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
result_count = len(search_results.get("matches", []))
|
|
290
|
+
logger.info(f"[Pinecone] Search completed, found {result_count} matches")
|
|
291
|
+
return search_results
|
|
292
|
+
|
|
293
|
+
except Exception as e:
|
|
294
|
+
logger.warning(f"[Pinecone] Failed to search namespace {namespace}: {str(e)}")
|
|
295
|
+
raise e
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
@pinecone_retry()
|
|
299
|
+
@trace_method
|
|
300
|
+
async def list_pinecone_index_for_files(file_id: str, actor: User, limit: int = None, pagination_token: str = None) -> List[str]:
|
|
301
|
+
if not PINECONE_AVAILABLE:
|
|
302
|
+
raise ImportError("Pinecone is not available. Please install pinecone to use this feature.")
|
|
303
|
+
|
|
304
|
+
namespace = actor.organization_id
|
|
305
|
+
logger.info(f"[Pinecone] Listing records for file {file_id} from index {settings.pinecone_source_index} namespace {namespace}")
|
|
306
|
+
logger.debug(f"[Pinecone] List params - limit: {limit}, pagination_token: {pagination_token}")
|
|
307
|
+
|
|
308
|
+
try:
|
|
309
|
+
async with PineconeAsyncio(api_key=settings.pinecone_api_key) as pc:
|
|
310
|
+
description = await pc.describe_index(name=settings.pinecone_source_index)
|
|
311
|
+
async with pc.IndexAsyncio(host=description.index.host) as dense_index:
|
|
312
|
+
|
|
313
|
+
kwargs = {"namespace": namespace, "prefix": file_id}
|
|
314
|
+
if limit is not None:
|
|
315
|
+
kwargs["limit"] = limit
|
|
316
|
+
if pagination_token is not None:
|
|
317
|
+
kwargs["pagination_token"] = pagination_token
|
|
318
|
+
|
|
319
|
+
try:
|
|
320
|
+
result = []
|
|
321
|
+
async for ids in dense_index.list(**kwargs):
|
|
322
|
+
result.extend(ids)
|
|
323
|
+
|
|
324
|
+
logger.info(f"[Pinecone] Successfully listed {len(result)} records for file {file_id}")
|
|
325
|
+
return result
|
|
326
|
+
|
|
327
|
+
except Exception as e:
|
|
328
|
+
logger.warning(f"[Pinecone] Failed to list records for file {file_id} in namespace {namespace}: {str(e)}")
|
|
329
|
+
raise e
|
|
330
|
+
|
|
331
|
+
except NotFoundException:
|
|
332
|
+
logger.warning(f"[Pinecone] Namespace {namespace} not found for file {file_id} and org {actor.organization_id}")
|
|
333
|
+
return []
|
{letta_nightly-0.8.13.dev20250714104447 → letta_nightly-0.8.14.dev20250714180504}/letta/orm/file.py
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import uuid
|
|
2
|
-
from typing import TYPE_CHECKING,
|
|
2
|
+
from typing import TYPE_CHECKING, Optional
|
|
3
3
|
|
|
4
4
|
from sqlalchemy import ForeignKey, Index, Integer, String, Text, UniqueConstraint, desc
|
|
5
5
|
from sqlalchemy.ext.asyncio import AsyncAttrs
|
|
@@ -11,10 +11,7 @@ from letta.schemas.enums import FileProcessingStatus
|
|
|
11
11
|
from letta.schemas.file import FileMetadata as PydanticFileMetadata
|
|
12
12
|
|
|
13
13
|
if TYPE_CHECKING:
|
|
14
|
-
|
|
15
|
-
from letta.orm.organization import Organization
|
|
16
|
-
from letta.orm.passage import SourcePassage
|
|
17
|
-
from letta.orm.source import Source
|
|
14
|
+
pass
|
|
18
15
|
|
|
19
16
|
|
|
20
17
|
# TODO: Note that this is NOT organization scoped, this is potentially dangerous if we misuse this
|
|
@@ -64,18 +61,6 @@ class FileMetadata(SqlalchemyBase, OrganizationMixin, SourceMixin, AsyncAttrs):
|
|
|
64
61
|
chunks_embedded: Mapped[Optional[int]] = mapped_column(Integer, nullable=True, doc="Number of chunks that have been embedded.")
|
|
65
62
|
|
|
66
63
|
# relationships
|
|
67
|
-
organization: Mapped["Organization"] = relationship("Organization", back_populates="files", lazy="selectin")
|
|
68
|
-
source: Mapped["Source"] = relationship("Source", back_populates="files", lazy="selectin")
|
|
69
|
-
source_passages: Mapped[List["SourcePassage"]] = relationship(
|
|
70
|
-
"SourcePassage", back_populates="file", lazy="selectin", cascade="all, delete-orphan"
|
|
71
|
-
)
|
|
72
|
-
file_agents: Mapped[List["FileAgent"]] = relationship(
|
|
73
|
-
"FileAgent",
|
|
74
|
-
back_populates="file",
|
|
75
|
-
lazy="selectin",
|
|
76
|
-
cascade="all, delete-orphan",
|
|
77
|
-
passive_deletes=True, # ← add this
|
|
78
|
-
)
|
|
79
64
|
content: Mapped[Optional["FileContent"]] = relationship(
|
|
80
65
|
"FileContent",
|
|
81
66
|
uselist=False,
|
|
@@ -12,7 +12,7 @@ from letta.schemas.block import Block as PydanticBlock
|
|
|
12
12
|
from letta.schemas.file import FileAgent as PydanticFileAgent
|
|
13
13
|
|
|
14
14
|
if TYPE_CHECKING:
|
|
15
|
-
|
|
15
|
+
pass
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
class FileAgent(SqlalchemyBase, OrganizationMixin):
|
|
@@ -55,6 +55,12 @@ class FileAgent(SqlalchemyBase, OrganizationMixin):
|
|
|
55
55
|
nullable=False,
|
|
56
56
|
doc="ID of the agent",
|
|
57
57
|
)
|
|
58
|
+
source_id: Mapped[str] = mapped_column(
|
|
59
|
+
String,
|
|
60
|
+
ForeignKey("sources.id", ondelete="CASCADE"),
|
|
61
|
+
nullable=False,
|
|
62
|
+
doc="ID of the source (denormalized from files.source_id)",
|
|
63
|
+
)
|
|
58
64
|
|
|
59
65
|
file_name: Mapped[str] = mapped_column(
|
|
60
66
|
String,
|
|
@@ -78,13 +84,6 @@ class FileAgent(SqlalchemyBase, OrganizationMixin):
|
|
|
78
84
|
back_populates="file_agents",
|
|
79
85
|
lazy="selectin",
|
|
80
86
|
)
|
|
81
|
-
file: Mapped["FileMetadata"] = relationship(
|
|
82
|
-
"FileMetadata",
|
|
83
|
-
foreign_keys=[file_id],
|
|
84
|
-
lazy="selectin",
|
|
85
|
-
back_populates="file_agents",
|
|
86
|
-
passive_deletes=True, # ← add this
|
|
87
|
-
)
|
|
88
87
|
|
|
89
88
|
# TODO: This is temporary as we figure out if we want FileBlock as a first class citizen
|
|
90
89
|
def to_pydantic_block(self) -> PydanticBlock:
|
|
@@ -99,8 +98,8 @@ class FileAgent(SqlalchemyBase, OrganizationMixin):
|
|
|
99
98
|
return PydanticBlock(
|
|
100
99
|
organization_id=self.organization_id,
|
|
101
100
|
value=visible_content,
|
|
102
|
-
label=self.file.file_name
|
|
101
|
+
label=self.file_name, # use denormalized file_name instead of self.file.file_name
|
|
103
102
|
read_only=True,
|
|
104
|
-
metadata={"source_id": self.
|
|
103
|
+
metadata={"source_id": self.source_id}, # use denormalized source_id
|
|
105
104
|
limit=CORE_MEMORY_SOURCE_CHAR_LIMIT,
|
|
106
105
|
)
|
|
@@ -9,7 +9,6 @@ if TYPE_CHECKING:
|
|
|
9
9
|
from letta.orm.agent import Agent
|
|
10
10
|
from letta.orm.agent_passage import AgentPassage
|
|
11
11
|
from letta.orm.block import Block
|
|
12
|
-
from letta.orm.file import FileMetadata
|
|
13
12
|
from letta.orm.group import Group
|
|
14
13
|
from letta.orm.identity import Identity
|
|
15
14
|
from letta.orm.llm_batch_item import LLMBatchItem
|
|
@@ -18,7 +17,6 @@ if TYPE_CHECKING:
|
|
|
18
17
|
from letta.orm.provider import Provider
|
|
19
18
|
from letta.orm.sandbox_config import AgentEnvironmentVariable, SandboxConfig
|
|
20
19
|
from letta.orm.sandbox_environment_variable import SandboxEnvironmentVariable
|
|
21
|
-
from letta.orm.source import Source
|
|
22
20
|
from letta.orm.source_passage import SourcePassage
|
|
23
21
|
from letta.orm.tool import Tool
|
|
24
22
|
from letta.orm.user import User
|
|
@@ -38,8 +36,6 @@ class Organization(SqlalchemyBase):
|
|
|
38
36
|
tools: Mapped[List["Tool"]] = relationship("Tool", back_populates="organization", cascade="all, delete-orphan")
|
|
39
37
|
# mcp_servers: Mapped[List["MCPServer"]] = relationship("MCPServer", back_populates="organization", cascade="all, delete-orphan")
|
|
40
38
|
blocks: Mapped[List["Block"]] = relationship("Block", back_populates="organization", cascade="all, delete-orphan")
|
|
41
|
-
sources: Mapped[List["Source"]] = relationship("Source", back_populates="organization", cascade="all, delete-orphan")
|
|
42
|
-
files: Mapped[List["FileMetadata"]] = relationship("FileMetadata", back_populates="organization", cascade="all, delete-orphan")
|
|
43
39
|
sandbox_configs: Mapped[List["SandboxConfig"]] = relationship(
|
|
44
40
|
"SandboxConfig", back_populates="organization", cascade="all, delete-orphan"
|
|
45
41
|
)
|
|
@@ -49,11 +49,6 @@ class SourcePassage(BasePassage, FileMixin, SourceMixin):
|
|
|
49
49
|
|
|
50
50
|
file_name: Mapped[str] = mapped_column(doc="The name of the file that this passage was derived from")
|
|
51
51
|
|
|
52
|
-
@declared_attr
|
|
53
|
-
def file(cls) -> Mapped["FileMetadata"]:
|
|
54
|
-
"""Relationship to file"""
|
|
55
|
-
return relationship("FileMetadata", back_populates="source_passages", lazy="selectin")
|
|
56
|
-
|
|
57
52
|
@declared_attr
|
|
58
53
|
def organization(cls) -> Mapped["Organization"]:
|
|
59
54
|
return relationship("Organization", back_populates="source_passages", lazy="selectin")
|
|
@@ -74,11 +69,6 @@ class SourcePassage(BasePassage, FileMixin, SourceMixin):
|
|
|
74
69
|
{"extend_existing": True},
|
|
75
70
|
)
|
|
76
71
|
|
|
77
|
-
@declared_attr
|
|
78
|
-
def source(cls) -> Mapped["Source"]:
|
|
79
|
-
"""Relationship to source"""
|
|
80
|
-
return relationship("Source", back_populates="passages", lazy="selectin", passive_deletes=True)
|
|
81
|
-
|
|
82
72
|
|
|
83
73
|
class AgentPassage(BasePassage, AgentMixin):
|
|
84
74
|
"""Passages created by agents as archival memories"""
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
from typing import TYPE_CHECKING,
|
|
1
|
+
from typing import TYPE_CHECKING, Optional
|
|
2
2
|
|
|
3
3
|
from sqlalchemy import JSON, Index, UniqueConstraint
|
|
4
|
-
from sqlalchemy.orm import Mapped, mapped_column
|
|
4
|
+
from sqlalchemy.orm import Mapped, mapped_column
|
|
5
5
|
|
|
6
|
-
from letta.orm import FileMetadata
|
|
7
6
|
from letta.orm.custom_columns import EmbeddingConfigColumn
|
|
8
7
|
from letta.orm.mixins import OrganizationMixin
|
|
9
8
|
from letta.orm.sqlalchemy_base import SqlalchemyBase
|
|
@@ -11,10 +10,7 @@ from letta.schemas.embedding_config import EmbeddingConfig
|
|
|
11
10
|
from letta.schemas.source import Source as PydanticSource
|
|
12
11
|
|
|
13
12
|
if TYPE_CHECKING:
|
|
14
|
-
|
|
15
|
-
from letta.orm.file import FileMetadata
|
|
16
|
-
from letta.orm.organization import Organization
|
|
17
|
-
from letta.orm.passage import SourcePassage
|
|
13
|
+
pass
|
|
18
14
|
|
|
19
15
|
|
|
20
16
|
class Source(SqlalchemyBase, OrganizationMixin):
|
|
@@ -34,16 +30,3 @@ class Source(SqlalchemyBase, OrganizationMixin):
|
|
|
34
30
|
instructions: Mapped[str] = mapped_column(nullable=True, doc="instructions for how to use the source")
|
|
35
31
|
embedding_config: Mapped[EmbeddingConfig] = mapped_column(EmbeddingConfigColumn, doc="Configuration settings for embedding.")
|
|
36
32
|
metadata_: Mapped[Optional[dict]] = mapped_column(JSON, nullable=True, doc="metadata for the source.")
|
|
37
|
-
|
|
38
|
-
# relationships
|
|
39
|
-
organization: Mapped["Organization"] = relationship("Organization", back_populates="sources")
|
|
40
|
-
files: Mapped[List["FileMetadata"]] = relationship("FileMetadata", back_populates="source", cascade="all, delete-orphan")
|
|
41
|
-
passages: Mapped[List["SourcePassage"]] = relationship("SourcePassage", back_populates="source", cascade="all, delete-orphan")
|
|
42
|
-
agents: Mapped[List["Agent"]] = relationship(
|
|
43
|
-
"Agent",
|
|
44
|
-
secondary="sources_agents",
|
|
45
|
-
back_populates="sources",
|
|
46
|
-
lazy="selectin",
|
|
47
|
-
cascade="save-update", # Only propagate save and update operations
|
|
48
|
-
passive_deletes=True, # Let the database handle deletions
|
|
49
|
-
)
|
|
@@ -85,6 +85,7 @@ class FileAgent(FileAgentBase):
|
|
|
85
85
|
)
|
|
86
86
|
agent_id: str = Field(..., description="Unique identifier of the agent.")
|
|
87
87
|
file_id: str = Field(..., description="Unique identifier of the file.")
|
|
88
|
+
source_id: str = Field(..., description="Unique identifier of the source (denormalized from files.source_id).")
|
|
88
89
|
file_name: str = Field(..., description="Name of the file.")
|
|
89
90
|
is_open: bool = Field(True, description="True if the agent currently has the file open.")
|
|
90
91
|
visible_content: Optional[str] = Field(
|
|
@@ -210,7 +210,7 @@ class BasicBlockMemory(Memory):
|
|
|
210
210
|
Append to the contents of core memory.
|
|
211
211
|
|
|
212
212
|
Args:
|
|
213
|
-
label (str): Section of the memory to be edited
|
|
213
|
+
label (str): Section of the memory to be edited.
|
|
214
214
|
content (str): Content to write to the memory. All unicode (including emojis) are supported.
|
|
215
215
|
|
|
216
216
|
Returns:
|
|
@@ -226,7 +226,7 @@ class BasicBlockMemory(Memory):
|
|
|
226
226
|
Replace the contents of core memory. To delete memories, use an empty string for new_content.
|
|
227
227
|
|
|
228
228
|
Args:
|
|
229
|
-
label (str): Section of the memory to be edited
|
|
229
|
+
label (str): Section of the memory to be edited.
|
|
230
230
|
old_content (str): String to replace. Must be an exact match.
|
|
231
231
|
new_content (str): Content to write to the memory. All unicode (including emojis) are supported.
|
|
232
232
|
|
|
@@ -272,14 +272,14 @@ async def modify_agent(
|
|
|
272
272
|
|
|
273
273
|
|
|
274
274
|
@router.get("/{agent_id}/tools", response_model=list[Tool], operation_id="list_agent_tools")
|
|
275
|
-
def list_agent_tools(
|
|
275
|
+
async def list_agent_tools(
|
|
276
276
|
agent_id: str,
|
|
277
277
|
server: "SyncServer" = Depends(get_letta_server),
|
|
278
278
|
actor_id: str | None = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
|
|
279
279
|
):
|
|
280
280
|
"""Get tools from an existing agent"""
|
|
281
|
-
actor = server.user_manager.
|
|
282
|
-
return server.agent_manager.
|
|
281
|
+
actor = await server.user_manager.get_actor_or_default_async(actor_id=actor_id)
|
|
282
|
+
return await server.agent_manager.list_attached_tools_async(agent_id=agent_id, actor=actor)
|
|
283
283
|
|
|
284
284
|
|
|
285
285
|
@router.patch("/{agent_id}/tools/attach/{tool_id}", response_model=AgentState, operation_id="attach_tool")
|
|
@@ -1072,7 +1072,7 @@ async def _process_message_background(
|
|
|
1072
1072
|
completed_at=datetime.now(timezone.utc),
|
|
1073
1073
|
metadata={"error": str(e)},
|
|
1074
1074
|
)
|
|
1075
|
-
await server.job_manager.update_job_by_id_async(job_id=
|
|
1075
|
+
await server.job_manager.update_job_by_id_async(job_id=run_id, job_update=job_update, actor=actor)
|
|
1076
1076
|
|
|
1077
1077
|
|
|
1078
1078
|
@router.post(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from typing import List, Optional
|
|
2
2
|
|
|
3
|
-
from fastapi import APIRouter, Body, Depends, Header, Query
|
|
3
|
+
from fastapi import APIRouter, Body, Depends, Header, Query
|
|
4
4
|
from fastapi.exceptions import HTTPException
|
|
5
5
|
from starlette.requests import Request
|
|
6
6
|
|
|
@@ -45,12 +45,8 @@ async def create_messages_batch(
|
|
|
45
45
|
if length > max_bytes:
|
|
46
46
|
raise HTTPException(status_code=413, detail=f"Request too large ({length} bytes). Max is {max_bytes} bytes.")
|
|
47
47
|
|
|
48
|
-
# Reject request if env var is not set
|
|
49
48
|
if not settings.enable_batch_job_polling:
|
|
50
|
-
|
|
51
|
-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
52
|
-
detail=f"Server misconfiguration: LETTA_ENABLE_BATCH_JOB_POLLING is set to False.",
|
|
53
|
-
)
|
|
49
|
+
logger.warning("Batch job polling is disabled. Enable batch processing by setting LETTA_ENABLE_BATCH_JOB_POLLING to True.")
|
|
54
50
|
|
|
55
51
|
actor = await server.user_manager.get_actor_or_default_async(actor_id=actor_id)
|
|
56
52
|
batch_job = BatchJob(
|
|
@@ -391,8 +391,8 @@ async def get_file_metadata(
|
|
|
391
391
|
if file_metadata.source_id != source_id:
|
|
392
392
|
raise HTTPException(status_code=404, detail=f"File with id={file_id} not found in source {source_id}.")
|
|
393
393
|
|
|
394
|
-
if should_use_pinecone() and
|
|
395
|
-
ids = await list_pinecone_index_for_files(file_id=file_id, actor=actor
|
|
394
|
+
if should_use_pinecone() and file_metadata.processing_status == FileProcessingStatus.EMBEDDING:
|
|
395
|
+
ids = await list_pinecone_index_for_files(file_id=file_id, actor=actor)
|
|
396
396
|
logger.info(
|
|
397
397
|
f"Embedded chunks {len(ids)}/{file_metadata.total_chunks} for {file_id} ({file_metadata.file_name}) in organization {actor.organization_id}"
|
|
398
398
|
)
|
|
@@ -402,7 +402,7 @@ async def get_file_metadata(
|
|
|
402
402
|
file_status = file_metadata.processing_status
|
|
403
403
|
else:
|
|
404
404
|
file_status = FileProcessingStatus.COMPLETED
|
|
405
|
-
await server.file_manager.update_file_status(
|
|
405
|
+
file_metadata = await server.file_manager.update_file_status(
|
|
406
406
|
file_id=file_metadata.id, actor=actor, chunks_embedded=len(ids), processing_status=file_status
|
|
407
407
|
)
|
|
408
408
|
|
|
@@ -1342,9 +1342,6 @@ class SyncServer(Server):
|
|
|
1342
1342
|
new_passage_size = await self.agent_manager.passage_size_async(actor=actor, agent_id=agent_id)
|
|
1343
1343
|
assert new_passage_size >= curr_passage_size # in case empty files are added
|
|
1344
1344
|
|
|
1345
|
-
# rebuild system prompt and force
|
|
1346
|
-
agent_state = await self.agent_manager.rebuild_system_prompt_async(agent_id=agent_id, actor=actor, force=True)
|
|
1347
|
-
|
|
1348
1345
|
# update job status
|
|
1349
1346
|
job.status = JobStatus.completed
|
|
1350
1347
|
job.metadata["num_passages"] = num_passages
|