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