letta-nightly 0.7.15.dev20250515104317__tar.gz → 0.7.17.dev20250516090339__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.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/PKG-INFO +3 -3
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/__init__.py +1 -1
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agent.py +12 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/helpers.py +48 -5
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/letta_agent.py +64 -28
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/letta_agent_batch.py +44 -26
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/voice_sleeptime_agent.py +6 -4
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/client/client.py +16 -1
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/constants.py +3 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/async_composio_toolset.py +1 -1
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/interfaces/anthropic_streaming_interface.py +40 -6
- letta_nightly-0.7.17.dev20250516090339/letta/interfaces/openai_streaming_interface.py +303 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/jobs/llm_batch_job_polling.py +6 -2
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/agent.py +102 -1
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/block.py +3 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/sqlalchemy_base.py +459 -158
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/agent.py +10 -2
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/block.py +3 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/memory.py +7 -2
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/agents.py +29 -27
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/blocks.py +1 -1
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/groups.py +2 -2
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/messages.py +11 -11
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/runs.py +2 -2
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/tools.py +4 -4
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/users.py +9 -9
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/voice.py +1 -1
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/server.py +74 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/agent_manager.py +417 -7
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/block_manager.py +12 -8
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/helpers/agent_manager_helper.py +19 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/job_manager.py +99 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/llm_batch_manager.py +28 -27
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/message_manager.py +66 -19
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/passage_manager.py +14 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_executor/tool_executor.py +19 -1
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_manager.py +13 -3
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/user_manager.py +70 -0
- letta_nightly-0.7.17.dev20250516090339/letta/types/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/pyproject.toml +3 -3
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/LICENSE +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/README.md +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/__main__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/base_agent.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/ephemeral_agent.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/exceptions.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agents/voice_agent.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/benchmark/benchmark.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/benchmark/constants.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/cli/cli.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/cli/cli_config.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/cli/cli_load.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/client/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/client/streaming.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/client/utils.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/config.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/data_sources/connectors.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/data_sources/connectors_helper.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/embeddings.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/errors.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/ast_parsers.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/composio_helpers.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/function_sets/base.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/function_sets/extras.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/function_sets/multi_agent.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/function_sets/voice.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/functions.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/helpers.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/interface.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/base_client.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/exceptions.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/sse_client.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/stdio_client.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/mcp_client/types.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/functions/schema_generator.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/dynamic_multi_agent.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/helpers.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/round_robin_multi_agent.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/sleeptime_multi_agent.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/sleeptime_multi_agent_v2.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/groups/supervisor_multi_agent.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/composio_helpers.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/converters.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/datetime_helpers.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/json_helpers.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/message_helper.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/tool_execution_helper.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/helpers/tool_rule_solver.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/humans/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/humans/examples/basic.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/humans/examples/cs_phd.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/interface.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/interfaces/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/interfaces/openai_chat_completions_streaming_interface.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/interfaces/utils.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/jobs/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/jobs/helpers.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/jobs/scheduler.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/jobs/types.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/anthropic.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/anthropic_client.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/aws_bedrock.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/azure_openai.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/azure_openai_constants.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/cohere.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/deepseek.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/google_ai_client.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/google_constants.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/google_vertex_client.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/helpers.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/llm_api_tools.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/llm_client.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/llm_client_base.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/mistral.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/openai.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/llm_api/openai_client.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/README.md +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/chat_completion_proxy.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/constants.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/function_parser.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/grammars/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/grammars/gbnf_grammar_generator.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/grammars/json.gbnf +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/grammars/json_func_calls_with_inner_thoughts.gbnf +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/json_parser.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/koboldcpp/api.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/koboldcpp/settings.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llamacpp/api.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llamacpp/settings.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/airoboros.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/chatml.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/dolphin.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/llama3.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/simple_summary_wrapper.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/wrapper_base.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/llm_chat_completion_wrappers/zephyr.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/lmstudio/api.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/lmstudio/settings.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/ollama/api.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/ollama/settings.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/settings/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/settings/deterministic_mirostat.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/settings/settings.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/settings/simple.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/utils.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/vllm/api.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/webui/api.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/webui/legacy_api.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/webui/legacy_settings.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/local_llm/webui/settings.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/log.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/main.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/memory.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/openai_backcompat/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/openai_backcompat/openai_object.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/__all__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/agents_tags.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/base.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/block_history.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/blocks_agents.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/custom_columns.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/enums.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/errors.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/file.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/group.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/groups_agents.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/groups_blocks.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/identities_agents.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/identities_blocks.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/identity.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/job.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/job_messages.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/llm_batch_items.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/llm_batch_job.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/message.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/mixins.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/organization.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/passage.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/provider.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/sandbox_config.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/source.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/sources_agents.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/sqlite_functions.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/step.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/tool.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/tools_agents.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/orm/user.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/anna_pa.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/google_search_persona.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/memgpt_doc.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/memgpt_starter.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/o1_persona.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sam.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sam_pov.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sam_simple_pov_gpt35.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sleeptime_doc_persona.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sleeptime_memory_persona.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/sqldb/test.db +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/personas/examples/voice_memory_persona.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/gpt_summarize.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/gpt_system.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_base.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_chat.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_chat_compressed.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_chat_fstring.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_convo_only.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_doc.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_gpt35_extralong.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_intuitive_knowledge.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_memory_only.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_modified_chat.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_modified_o1.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_offline_memory.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_offline_memory_chat.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/memgpt_sleeptime_chat.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/sleeptime.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/sleeptime_doc_ingest.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/voice_chat.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/prompts/system/voice_sleeptime.txt +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/pytest.ini +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/embedding_config.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/embedding_config_overrides.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/enums.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/environment_variables.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/file.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/group.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/health.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/identity.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/job.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/letta_base.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/letta_message.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/letta_message_content.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/letta_request.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/letta_response.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/llm_batch_job.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/llm_config.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/llm_config_overrides.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/message.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/openai/chat_completion_request.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/openai/chat_completion_response.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/openai/chat_completions.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/openai/embedding_response.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/openai/openai.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/organization.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/passage.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/providers.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/response_format.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/run.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/sandbox_config.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/source.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/step.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/tool.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/tool_execution_result.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/tool_rule.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/usage.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/schemas/user.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_agent.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_agent_environment_variable.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_base.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_block.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_custom_fields.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_message.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_tag.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/marshmallow_tool.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/serialize_schemas/pydantic_agent_schema.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/constants.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/db.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/generate_openapi_schema.sh +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/app.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/auth/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/auth/index.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/auth_token.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/chat_completions_interface.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/interface.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/json_parser.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/openai/chat_completions/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/embeddings.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/health.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/identities.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/jobs.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/llms.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/organizations.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/providers.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/sandbox_configs.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/sources.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/steps.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/routers/v1/tags.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/static_files.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/rest_api/utils.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/startup.sh +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/static_files/assets/index-048c9598.js +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/static_files/assets/index-0e31b727.css +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/static_files/favicon.ico +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/static_files/index.html +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/static_files/memgpt_logo_transparent.png +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/utils.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/ws_api/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/ws_api/example_client.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/ws_api/interface.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/ws_api/protocol.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/server/ws_api/server.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/group_manager.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/helpers/tool_execution_helper.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/identity_manager.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/mcp/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/mcp/base_client.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/mcp/sse_client.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/mcp/stdio_client.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/mcp/types.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/organization_manager.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/per_agent_lock_manager.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/provider_manager.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/sandbox_config_manager.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/source_manager.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/step_manager.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/summarizer/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/summarizer/enums.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/summarizer/summarizer.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_executor/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_executor/tool_execution_manager.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_executor/tool_execution_sandbox.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_sandbox/__init__.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_sandbox/base.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_sandbox/e2b_sandbox.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/services/tool_sandbox/local_sandbox.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/settings.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/streaming_interface.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/streaming_utils.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/system.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/tracing.py +0 -0
- {letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/utils.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: letta-nightly
|
3
|
-
Version: 0.7.
|
3
|
+
Version: 0.7.17.dev20250516090339
|
4
4
|
Summary: Create LLM agents with long-term memory and custom tools
|
5
5
|
License: Apache License
|
6
6
|
Author: Letta Team
|
@@ -51,7 +51,7 @@ Requires-Dist: isort (>=5.13.2,<6.0.0) ; extra == "dev" or extra == "all"
|
|
51
51
|
Requires-Dist: jinja2 (>=3.1.5,<4.0.0)
|
52
52
|
Requires-Dist: langchain (>=0.3.7,<0.4.0) ; extra == "external-tools" or extra == "desktop" or extra == "all"
|
53
53
|
Requires-Dist: langchain-community (>=0.3.7,<0.4.0) ; extra == "external-tools" or extra == "desktop" or extra == "all"
|
54
|
-
Requires-Dist: letta_client (>=0.1.
|
54
|
+
Requires-Dist: letta_client (>=0.1.143,<0.2.0)
|
55
55
|
Requires-Dist: llama-index (>=0.12.2,<0.13.0)
|
56
56
|
Requires-Dist: llama-index-embeddings-openai (>=0.3.1,<0.4.0)
|
57
57
|
Requires-Dist: locust (>=2.31.5,<3.0.0) ; extra == "dev" or extra == "desktop" or extra == "all"
|
@@ -77,7 +77,7 @@ Requires-Dist: pydantic (>=2.10.6,<3.0.0)
|
|
77
77
|
Requires-Dist: pydantic-settings (>=2.2.1,<3.0.0)
|
78
78
|
Requires-Dist: pyhumps (>=3.8.0,<4.0.0)
|
79
79
|
Requires-Dist: pyright (>=1.1.347,<2.0.0) ; extra == "dev" or extra == "desktop" or extra == "all"
|
80
|
-
Requires-Dist: pytest-asyncio (>=0.
|
80
|
+
Requires-Dist: pytest-asyncio (>=0.24.0,<0.25.0) ; extra == "dev" or extra == "all"
|
81
81
|
Requires-Dist: pytest-order (>=1.2.0,<2.0.0) ; extra == "dev" or extra == "all"
|
82
82
|
Requires-Dist: python-box (>=7.1.1,<8.0.0)
|
83
83
|
Requires-Dist: python-multipart (>=0.0.19,<0.0.20)
|
{letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/agent.py
RENAMED
@@ -179,6 +179,15 @@ class Agent(BaseAgent):
|
|
179
179
|
raise ValueError(f"Invalid JSON format in message: {text_content}")
|
180
180
|
return None
|
181
181
|
|
182
|
+
def ensure_read_only_block_not_modified(self, new_memory: Memory) -> None:
|
183
|
+
"""
|
184
|
+
Throw an error if a read-only block has been modified
|
185
|
+
"""
|
186
|
+
for label in self.agent_state.memory.list_block_labels():
|
187
|
+
if self.agent_state.memory.get_block(label).read_only:
|
188
|
+
if new_memory.get_block(label).value != self.agent_state.memory.get_block(label).value:
|
189
|
+
raise ValueError(READ_ONLY_BLOCK_EDIT_ERROR)
|
190
|
+
|
182
191
|
def update_memory_if_changed(self, new_memory: Memory) -> bool:
|
183
192
|
"""
|
184
193
|
Update internal memory object and system prompt if there have been modifications.
|
@@ -1277,6 +1286,9 @@ class Agent(BaseAgent):
|
|
1277
1286
|
agent_state_copy = self.agent_state.__deepcopy__()
|
1278
1287
|
function_args["agent_state"] = agent_state_copy # need to attach self to arg since it's dynamically linked
|
1279
1288
|
function_response = callable_func(**function_args)
|
1289
|
+
self.ensure_read_only_block_not_modified(
|
1290
|
+
new_memory=agent_state_copy.memory
|
1291
|
+
) # memory editing tools cannot edit read-only blocks
|
1280
1292
|
self.update_memory_if_changed(agent_state_copy.memory)
|
1281
1293
|
elif target_letta_tool.tool_type == ToolType.EXTERNAL_COMPOSIO:
|
1282
1294
|
action_name = generate_composio_action_from_func_name(target_letta_tool.name)
|
@@ -10,14 +10,18 @@ from letta.server.rest_api.utils import create_input_messages
|
|
10
10
|
from letta.services.message_manager import MessageManager
|
11
11
|
|
12
12
|
|
13
|
-
def _create_letta_response(
|
13
|
+
def _create_letta_response(
|
14
|
+
new_in_context_messages: list[Message], use_assistant_message: bool, usage: LettaUsageStatistics
|
15
|
+
) -> LettaResponse:
|
14
16
|
"""
|
15
17
|
Converts the newly created/persisted messages into a LettaResponse.
|
16
18
|
"""
|
17
|
-
|
18
|
-
for
|
19
|
-
|
20
|
-
|
19
|
+
# NOTE: hacky solution to avoid returning heartbeat messages and the original user message
|
20
|
+
filter_user_messages = [m for m in new_in_context_messages if m.role != "user"]
|
21
|
+
response_messages = Message.to_letta_messages_from_list(
|
22
|
+
messages=filter_user_messages, use_assistant_message=use_assistant_message, reverse=False
|
23
|
+
)
|
24
|
+
return LettaResponse(messages=response_messages, usage=usage)
|
21
25
|
|
22
26
|
|
23
27
|
def _prepare_in_context_messages(
|
@@ -56,6 +60,45 @@ def _prepare_in_context_messages(
|
|
56
60
|
return current_in_context_messages, new_in_context_messages
|
57
61
|
|
58
62
|
|
63
|
+
async def _prepare_in_context_messages_async(
|
64
|
+
input_messages: List[MessageCreate],
|
65
|
+
agent_state: AgentState,
|
66
|
+
message_manager: MessageManager,
|
67
|
+
actor: User,
|
68
|
+
) -> Tuple[List[Message], List[Message]]:
|
69
|
+
"""
|
70
|
+
Prepares in-context messages for an agent, based on the current state and a new user input.
|
71
|
+
Async version of _prepare_in_context_messages.
|
72
|
+
|
73
|
+
Args:
|
74
|
+
input_messages (List[MessageCreate]): The new user input messages to process.
|
75
|
+
agent_state (AgentState): The current state of the agent, including message buffer config.
|
76
|
+
message_manager (MessageManager): The manager used to retrieve and create messages.
|
77
|
+
actor (User): The user performing the action, used for access control and attribution.
|
78
|
+
|
79
|
+
Returns:
|
80
|
+
Tuple[List[Message], List[Message]]: A tuple containing:
|
81
|
+
- The current in-context messages (existing context for the agent).
|
82
|
+
- The new in-context messages (messages created from the new input).
|
83
|
+
"""
|
84
|
+
|
85
|
+
if agent_state.message_buffer_autoclear:
|
86
|
+
# If autoclear is enabled, only include the most recent system message (usually at index 0)
|
87
|
+
current_in_context_messages = [
|
88
|
+
(await message_manager.get_messages_by_ids_async(message_ids=agent_state.message_ids, actor=actor))[0]
|
89
|
+
]
|
90
|
+
else:
|
91
|
+
# Otherwise, include the full list of messages by ID for context
|
92
|
+
current_in_context_messages = await message_manager.get_messages_by_ids_async(message_ids=agent_state.message_ids, actor=actor)
|
93
|
+
|
94
|
+
# Create a new user message from the input and store it
|
95
|
+
new_in_context_messages = await message_manager.create_many_messages_async(
|
96
|
+
create_input_messages(input_messages=input_messages, agent_id=agent_state.id, actor=actor), actor=actor
|
97
|
+
)
|
98
|
+
|
99
|
+
return current_in_context_messages, new_in_context_messages
|
100
|
+
|
101
|
+
|
59
102
|
def serialize_message_history(messages: List[str], context: str) -> str:
|
60
103
|
"""
|
61
104
|
Produce an XML document like:
|
@@ -4,13 +4,15 @@ import uuid
|
|
4
4
|
from typing import Any, AsyncGenerator, Dict, List, Optional, Tuple, Union
|
5
5
|
|
6
6
|
from openai import AsyncStream
|
7
|
+
from openai.types import CompletionUsage
|
7
8
|
from openai.types.chat import ChatCompletion, ChatCompletionChunk
|
8
9
|
|
9
10
|
from letta.agents.base_agent import BaseAgent
|
10
|
-
from letta.agents.helpers import _create_letta_response,
|
11
|
+
from letta.agents.helpers import _create_letta_response, _prepare_in_context_messages_async
|
11
12
|
from letta.helpers import ToolRulesSolver
|
12
13
|
from letta.helpers.tool_execution_helper import enable_strict_mode
|
13
14
|
from letta.interfaces.anthropic_streaming_interface import AnthropicStreamingInterface
|
15
|
+
from letta.interfaces.openai_streaming_interface import OpenAIStreamingInterface
|
14
16
|
from letta.llm_api.llm_client import LLMClient
|
15
17
|
from letta.llm_api.llm_client_base import LLMClientBase
|
16
18
|
from letta.local_llm.constants import INNER_THOUGHTS_KWARG
|
@@ -23,6 +25,7 @@ from letta.schemas.letta_message_content import OmittedReasoningContent, Reasoni
|
|
23
25
|
from letta.schemas.letta_response import LettaResponse
|
24
26
|
from letta.schemas.message import Message, MessageCreate
|
25
27
|
from letta.schemas.openai.chat_completion_response import ToolCall
|
28
|
+
from letta.schemas.usage import LettaUsageStatistics
|
26
29
|
from letta.schemas.user import User
|
27
30
|
from letta.server.rest_api.utils import create_letta_messages_from_llm_response
|
28
31
|
from letta.services.agent_manager import AgentManager
|
@@ -47,7 +50,6 @@ class LettaAgent(BaseAgent):
|
|
47
50
|
block_manager: BlockManager,
|
48
51
|
passage_manager: PassageManager,
|
49
52
|
actor: User,
|
50
|
-
use_assistant_message: bool = True,
|
51
53
|
):
|
52
54
|
super().__init__(agent_id=agent_id, openai_client=None, message_manager=message_manager, agent_manager=agent_manager, actor=actor)
|
53
55
|
|
@@ -55,27 +57,28 @@ class LettaAgent(BaseAgent):
|
|
55
57
|
# Summarizer settings
|
56
58
|
self.block_manager = block_manager
|
57
59
|
self.passage_manager = passage_manager
|
58
|
-
self.use_assistant_message = use_assistant_message
|
59
60
|
self.response_messages: List[Message] = []
|
60
61
|
|
61
|
-
self.last_function_response =
|
62
|
+
self.last_function_response = None
|
62
63
|
|
63
64
|
# Cached archival memory/message size
|
64
|
-
self.num_messages =
|
65
|
-
self.num_archival_memories =
|
65
|
+
self.num_messages = 0
|
66
|
+
self.num_archival_memories = 0
|
66
67
|
|
67
68
|
@trace_method
|
68
|
-
async def step(self, input_messages: List[MessageCreate], max_steps: int = 10) -> LettaResponse:
|
69
|
-
agent_state = self.agent_manager.
|
70
|
-
current_in_context_messages, new_in_context_messages = await self._step(
|
69
|
+
async def step(self, input_messages: List[MessageCreate], max_steps: int = 10, use_assistant_message: bool = True) -> LettaResponse:
|
70
|
+
agent_state = await self.agent_manager.get_agent_by_id_async(self.agent_id, actor=self.actor)
|
71
|
+
current_in_context_messages, new_in_context_messages, usage = await self._step(
|
71
72
|
agent_state=agent_state, input_messages=input_messages, max_steps=max_steps
|
72
73
|
)
|
73
|
-
return _create_letta_response(
|
74
|
+
return _create_letta_response(
|
75
|
+
new_in_context_messages=new_in_context_messages, use_assistant_message=use_assistant_message, usage=usage
|
76
|
+
)
|
74
77
|
|
75
78
|
async def _step(
|
76
79
|
self, agent_state: AgentState, input_messages: List[MessageCreate], max_steps: int = 10
|
77
|
-
) -> Tuple[List[Message], List[Message]]:
|
78
|
-
current_in_context_messages, new_in_context_messages =
|
80
|
+
) -> Tuple[List[Message], List[Message], CompletionUsage]:
|
81
|
+
current_in_context_messages, new_in_context_messages = await _prepare_in_context_messages_async(
|
79
82
|
input_messages, agent_state, self.message_manager, self.actor
|
80
83
|
)
|
81
84
|
tool_rules_solver = ToolRulesSolver(agent_state.tool_rules)
|
@@ -84,6 +87,7 @@ class LettaAgent(BaseAgent):
|
|
84
87
|
put_inner_thoughts_first=True,
|
85
88
|
actor=self.actor,
|
86
89
|
)
|
90
|
+
usage = LettaUsageStatistics()
|
87
91
|
for _ in range(max_steps):
|
88
92
|
response = await self._get_ai_reply(
|
89
93
|
llm_client=llm_client,
|
@@ -95,11 +99,21 @@ class LettaAgent(BaseAgent):
|
|
95
99
|
)
|
96
100
|
|
97
101
|
tool_call = response.choices[0].message.tool_calls[0]
|
102
|
+
reasoning = [TextContent(text=response.choices[0].message.content)] # reasoning placed into content for legacy reasons
|
98
103
|
|
99
|
-
persisted_messages, should_continue = await self._handle_ai_response(
|
104
|
+
persisted_messages, should_continue = await self._handle_ai_response(
|
105
|
+
tool_call, agent_state, tool_rules_solver, reasoning_content=reasoning
|
106
|
+
)
|
100
107
|
self.response_messages.extend(persisted_messages)
|
101
108
|
new_in_context_messages.extend(persisted_messages)
|
102
109
|
|
110
|
+
# update usage
|
111
|
+
# TODO: add run_id
|
112
|
+
usage.step_count += 1
|
113
|
+
usage.completion_tokens += response.usage.completion_tokens
|
114
|
+
usage.prompt_tokens += response.usage.prompt_tokens
|
115
|
+
usage.total_tokens += response.usage.total_tokens
|
116
|
+
|
103
117
|
if not should_continue:
|
104
118
|
break
|
105
119
|
|
@@ -108,18 +122,18 @@ class LettaAgent(BaseAgent):
|
|
108
122
|
message_ids = [m.id for m in (current_in_context_messages + new_in_context_messages)]
|
109
123
|
self.agent_manager.set_in_context_messages(agent_id=self.agent_id, message_ids=message_ids, actor=self.actor)
|
110
124
|
|
111
|
-
return current_in_context_messages, new_in_context_messages
|
125
|
+
return current_in_context_messages, new_in_context_messages, usage
|
112
126
|
|
113
127
|
@trace_method
|
114
128
|
async def step_stream(
|
115
|
-
self, input_messages: List[MessageCreate], max_steps: int = 10, use_assistant_message: bool = False
|
129
|
+
self, input_messages: List[MessageCreate], max_steps: int = 10, use_assistant_message: bool = True, stream_tokens: bool = False
|
116
130
|
) -> AsyncGenerator[str, None]:
|
117
131
|
"""
|
118
132
|
Main streaming loop that yields partial tokens.
|
119
133
|
Whenever we detect a tool call, we yield from _handle_ai_response as well.
|
120
134
|
"""
|
121
|
-
agent_state = self.agent_manager.
|
122
|
-
current_in_context_messages, new_in_context_messages =
|
135
|
+
agent_state = await self.agent_manager.get_agent_by_id_async(self.agent_id, actor=self.actor)
|
136
|
+
current_in_context_messages, new_in_context_messages = await _prepare_in_context_messages_async(
|
123
137
|
input_messages, agent_state, self.message_manager, self.actor
|
124
138
|
)
|
125
139
|
tool_rules_solver = ToolRulesSolver(agent_state.tool_rules)
|
@@ -128,6 +142,7 @@ class LettaAgent(BaseAgent):
|
|
128
142
|
put_inner_thoughts_first=True,
|
129
143
|
actor=self.actor,
|
130
144
|
)
|
145
|
+
usage = LettaUsageStatistics()
|
131
146
|
|
132
147
|
for _ in range(max_steps):
|
133
148
|
stream = await self._get_ai_reply(
|
@@ -137,15 +152,27 @@ class LettaAgent(BaseAgent):
|
|
137
152
|
tool_rules_solver=tool_rules_solver,
|
138
153
|
stream=True,
|
139
154
|
)
|
140
|
-
|
141
155
|
# TODO: THIS IS INCREDIBLY UGLY
|
142
156
|
# TODO: THERE ARE MULTIPLE COPIES OF THE LLM_CONFIG EVERYWHERE THAT ARE GETTING MANIPULATED
|
143
|
-
|
144
|
-
|
145
|
-
|
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
|
+
)
|
146
167
|
async for chunk in interface.process(stream):
|
147
168
|
yield f"data: {chunk.model_dump_json()}\n\n"
|
148
169
|
|
170
|
+
# update usage
|
171
|
+
usage.step_count += 1
|
172
|
+
usage.completion_tokens += interface.output_tokens
|
173
|
+
usage.prompt_tokens += interface.input_tokens
|
174
|
+
usage.total_tokens += interface.input_tokens + interface.output_tokens
|
175
|
+
|
149
176
|
# Process resulting stream content
|
150
177
|
tool_call = interface.get_tool_call_object()
|
151
178
|
reasoning_content = interface.get_reasoning_content()
|
@@ -160,6 +187,10 @@ class LettaAgent(BaseAgent):
|
|
160
187
|
self.response_messages.extend(persisted_messages)
|
161
188
|
new_in_context_messages.extend(persisted_messages)
|
162
189
|
|
190
|
+
if not use_assistant_message or should_continue:
|
191
|
+
tool_return = [msg for msg in persisted_messages if msg.role == "tool"][-1].to_letta_messages()[0]
|
192
|
+
yield f"data: {tool_return.model_dump_json()}\n\n"
|
193
|
+
|
163
194
|
if not should_continue:
|
164
195
|
break
|
165
196
|
|
@@ -170,11 +201,11 @@ class LettaAgent(BaseAgent):
|
|
170
201
|
|
171
202
|
# TODO: This may be out of sync, if in between steps users add files
|
172
203
|
# NOTE (cliandy): temporary for now for particlar use cases.
|
173
|
-
self.num_messages = self.message_manager.
|
174
|
-
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)
|
175
206
|
|
176
207
|
# TODO: Also yield out a letta usage stats SSE
|
177
|
-
|
208
|
+
yield f"data: {usage.model_dump_json()}\n\n"
|
178
209
|
yield f"data: {MessageStreamStatus.done.model_dump_json()}\n\n"
|
179
210
|
|
180
211
|
@trace_method
|
@@ -188,6 +219,10 @@ class LettaAgent(BaseAgent):
|
|
188
219
|
stream: bool,
|
189
220
|
) -> ChatCompletion | AsyncStream[ChatCompletionChunk]:
|
190
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
|
+
)
|
191
226
|
in_context_messages = await self._rebuild_memory_async(
|
192
227
|
in_context_messages, agent_state, num_messages=self.num_messages, num_archival_memories=self.num_archival_memories
|
193
228
|
)
|
@@ -214,6 +249,8 @@ class LettaAgent(BaseAgent):
|
|
214
249
|
]
|
215
250
|
|
216
251
|
# Mirror the sync agent loop: get allowed tools or allow all if none are allowed
|
252
|
+
if self.last_function_response is None:
|
253
|
+
self.last_function_response = await self._load_last_function_response_async()
|
217
254
|
valid_tool_names = tool_rules_solver.get_allowed_tool_names(
|
218
255
|
available_tools=set([t.name for t in tools]),
|
219
256
|
last_function_response=self.last_function_response,
|
@@ -307,7 +344,7 @@ class LettaAgent(BaseAgent):
|
|
307
344
|
pre_computed_assistant_message_id=pre_computed_assistant_message_id,
|
308
345
|
pre_computed_tool_message_id=pre_computed_tool_message_id,
|
309
346
|
)
|
310
|
-
persisted_messages = self.message_manager.
|
347
|
+
persisted_messages = await self.message_manager.create_many_messages_async(tool_call_messages, actor=self.actor)
|
311
348
|
self.last_function_response = function_response
|
312
349
|
|
313
350
|
return persisted_messages, continue_stepping
|
@@ -359,7 +396,6 @@ class LettaAgent(BaseAgent):
|
|
359
396
|
block_manager=self.block_manager,
|
360
397
|
passage_manager=self.passage_manager,
|
361
398
|
actor=self.actor,
|
362
|
-
use_assistant_message=True,
|
363
399
|
)
|
364
400
|
|
365
401
|
augmented_message = (
|
@@ -394,9 +430,9 @@ class LettaAgent(BaseAgent):
|
|
394
430
|
results = await asyncio.gather(*tasks)
|
395
431
|
return results
|
396
432
|
|
397
|
-
def
|
433
|
+
async def _load_last_function_response_async(self):
|
398
434
|
"""Load the last function response from message history"""
|
399
|
-
in_context_messages = self.agent_manager.
|
435
|
+
in_context_messages = await self.agent_manager.get_in_context_messages_async(agent_id=self.agent_id, actor=self.actor)
|
400
436
|
for msg in reversed(in_context_messages):
|
401
437
|
if msg.role == MessageRole.tool and msg.content and len(msg.content) == 1 and isinstance(msg.content[0], TextContent):
|
402
438
|
text_content = msg.content[0].text
|
@@ -7,7 +7,7 @@ from aiomultiprocess import Pool
|
|
7
7
|
from anthropic.types.beta.messages import BetaMessageBatchCanceledResult, BetaMessageBatchErroredResult, BetaMessageBatchSucceededResult
|
8
8
|
|
9
9
|
from letta.agents.base_agent import BaseAgent
|
10
|
-
from letta.agents.helpers import
|
10
|
+
from letta.agents.helpers import _prepare_in_context_messages_async
|
11
11
|
from letta.helpers import ToolRulesSolver
|
12
12
|
from letta.helpers.datetime_helpers import get_utc_time
|
13
13
|
from letta.helpers.tool_execution_helper import enable_strict_mode
|
@@ -107,7 +107,6 @@ class LettaAgentBatch(BaseAgent):
|
|
107
107
|
sandbox_config_manager: SandboxConfigManager,
|
108
108
|
job_manager: JobManager,
|
109
109
|
actor: User,
|
110
|
-
use_assistant_message: bool = True,
|
111
110
|
max_steps: int = 10,
|
112
111
|
):
|
113
112
|
self.message_manager = message_manager
|
@@ -117,7 +116,6 @@ class LettaAgentBatch(BaseAgent):
|
|
117
116
|
self.batch_manager = batch_manager
|
118
117
|
self.sandbox_config_manager = sandbox_config_manager
|
119
118
|
self.job_manager = job_manager
|
120
|
-
self.use_assistant_message = use_assistant_message
|
121
119
|
self.actor = actor
|
122
120
|
self.max_steps = max_steps
|
123
121
|
|
@@ -128,6 +126,7 @@ class LettaAgentBatch(BaseAgent):
|
|
128
126
|
letta_batch_job_id: str,
|
129
127
|
agent_step_state_mapping: Optional[Dict[str, AgentStepState]] = None,
|
130
128
|
) -> LettaBatchResponse:
|
129
|
+
"""Carry out agent steps until the LLM request is sent."""
|
131
130
|
log_event(name="validate_inputs")
|
132
131
|
if not batch_requests:
|
133
132
|
raise ValueError("Empty list of batch_requests passed in!")
|
@@ -135,15 +134,26 @@ class LettaAgentBatch(BaseAgent):
|
|
135
134
|
agent_step_state_mapping = {}
|
136
135
|
|
137
136
|
log_event(name="load_and_prepare_agents")
|
138
|
-
|
139
|
-
|
137
|
+
# prepares (1) agent states, (2) step states, (3) LLMBatchItems (4) message batch_item_ids (5) messages per agent (6) tools per agent
|
138
|
+
|
139
|
+
agent_messages_mapping: dict[str, list[Message]] = {}
|
140
|
+
agent_tools_mapping: dict[str, list[dict]] = {}
|
140
141
|
# TODO: This isn't optimal, moving fast - prone to bugs because we pass around this half formed pydantic object
|
141
|
-
agent_batch_item_mapping:
|
142
|
+
agent_batch_item_mapping: dict[str, LLMBatchItem] = {}
|
143
|
+
|
144
|
+
# fetch agent states in batch
|
145
|
+
agent_mapping = {
|
146
|
+
agent_state.id: agent_state
|
147
|
+
for agent_state in await self.agent_manager.get_agents_by_ids_async(
|
148
|
+
agent_ids=[request.agent_id for request in batch_requests], actor=self.actor
|
149
|
+
)
|
150
|
+
}
|
151
|
+
|
142
152
|
agent_states = []
|
143
153
|
for batch_request in batch_requests:
|
144
154
|
agent_id = batch_request.agent_id
|
145
|
-
agent_state =
|
146
|
-
agent_states.append(agent_state)
|
155
|
+
agent_state = agent_mapping[agent_id]
|
156
|
+
agent_states.append(agent_state) # keeping this to maintain ordering, but may not be necessary
|
147
157
|
|
148
158
|
if agent_id not in agent_step_state_mapping:
|
149
159
|
agent_step_state_mapping[agent_id] = AgentStepState(
|
@@ -164,7 +174,7 @@ class LettaAgentBatch(BaseAgent):
|
|
164
174
|
for msg in batch_request.messages:
|
165
175
|
msg.batch_item_id = llm_batch_item.id
|
166
176
|
|
167
|
-
agent_messages_mapping[agent_id] = self.
|
177
|
+
agent_messages_mapping[agent_id] = await self._prepare_in_context_messages_per_agent_async(
|
168
178
|
agent_state=agent_state, input_messages=batch_request.messages
|
169
179
|
)
|
170
180
|
|
@@ -186,7 +196,7 @@ class LettaAgentBatch(BaseAgent):
|
|
186
196
|
)
|
187
197
|
|
188
198
|
log_event(name="persist_llm_batch_job")
|
189
|
-
llm_batch_job = self.batch_manager.
|
199
|
+
llm_batch_job = await self.batch_manager.create_llm_batch_job_async(
|
190
200
|
llm_provider=ProviderType.anthropic, # TODO: Expand to more providers
|
191
201
|
create_batch_response=batch_response,
|
192
202
|
actor=self.actor,
|
@@ -204,7 +214,7 @@ class LettaAgentBatch(BaseAgent):
|
|
204
214
|
|
205
215
|
if batch_items:
|
206
216
|
log_event(name="bulk_create_batch_items")
|
207
|
-
batch_items_persisted = self.batch_manager.
|
217
|
+
batch_items_persisted = await self.batch_manager.create_llm_batch_items_bulk_async(batch_items, actor=self.actor)
|
208
218
|
|
209
219
|
log_event(name="return_batch_response")
|
210
220
|
return LettaBatchResponse(
|
@@ -219,7 +229,7 @@ class LettaAgentBatch(BaseAgent):
|
|
219
229
|
@trace_method
|
220
230
|
async def resume_step_after_request(self, letta_batch_id: str, llm_batch_id: str) -> LettaBatchResponse:
|
221
231
|
log_event(name="load_context")
|
222
|
-
llm_batch_job = self.batch_manager.
|
232
|
+
llm_batch_job = await self.batch_manager.get_llm_batch_job_by_id_async(llm_batch_id=llm_batch_id, actor=self.actor)
|
223
233
|
ctx = await self._collect_resume_context(llm_batch_id)
|
224
234
|
|
225
235
|
log_event(name="update_statuses")
|
@@ -229,7 +239,7 @@ class LettaAgentBatch(BaseAgent):
|
|
229
239
|
exec_results = await self._execute_tools(ctx)
|
230
240
|
|
231
241
|
log_event(name="persist_messages")
|
232
|
-
msg_map = self._persist_tool_messages(exec_results, ctx)
|
242
|
+
msg_map = await self._persist_tool_messages(exec_results, ctx)
|
233
243
|
|
234
244
|
log_event(name="mark_steps_done")
|
235
245
|
self._mark_steps_complete(llm_batch_id, ctx.agent_ids)
|
@@ -237,7 +247,9 @@ class LettaAgentBatch(BaseAgent):
|
|
237
247
|
log_event(name="prepare_next")
|
238
248
|
next_reqs, next_step_state = self._prepare_next_iteration(exec_results, ctx, msg_map)
|
239
249
|
if len(next_reqs) == 0:
|
240
|
-
self.job_manager.
|
250
|
+
await self.job_manager.update_job_by_id_async(
|
251
|
+
job_id=letta_batch_id, job_update=JobUpdate(status=JobStatus.completed), actor=self.actor
|
252
|
+
)
|
241
253
|
return LettaBatchResponse(
|
242
254
|
letta_batch_id=llm_batch_job.letta_batch_job_id,
|
243
255
|
last_llm_batch_id=llm_batch_job.id,
|
@@ -256,18 +268,22 @@ class LettaAgentBatch(BaseAgent):
|
|
256
268
|
@trace_method
|
257
269
|
async def _collect_resume_context(self, llm_batch_id: str) -> _ResumeContext:
|
258
270
|
# NOTE: We only continue for items with successful results
|
259
|
-
batch_items = self.batch_manager.
|
271
|
+
batch_items = await self.batch_manager.list_llm_batch_items_async(llm_batch_id=llm_batch_id, request_status=JobStatus.completed)
|
260
272
|
|
261
|
-
agent_ids
|
262
|
-
provider_results
|
273
|
+
agent_ids = []
|
274
|
+
provider_results = {}
|
263
275
|
request_status_updates: List[RequestStatusUpdateInfo] = []
|
264
276
|
|
265
277
|
for item in batch_items:
|
266
278
|
aid = item.agent_id
|
267
279
|
agent_ids.append(aid)
|
268
|
-
agent_state_map[aid] = self.agent_manager.get_agent_by_id(aid, actor=self.actor)
|
269
280
|
provider_results[aid] = item.batch_request_result.result
|
270
281
|
|
282
|
+
agent_states = await self.agent_manager.get_agents_by_ids_async(agent_ids, actor=self.actor)
|
283
|
+
agent_state_map = {agent.id: agent for agent in agent_states}
|
284
|
+
|
285
|
+
name_map, args_map, cont_map = {}, {}, {}
|
286
|
+
for aid in agent_ids:
|
271
287
|
# status bookkeeping
|
272
288
|
pr = provider_results[aid]
|
273
289
|
status = (
|
@@ -344,14 +360,14 @@ class LettaAgentBatch(BaseAgent):
|
|
344
360
|
tool_params.append(param)
|
345
361
|
|
346
362
|
if rethink_memory_params:
|
347
|
-
return self.
|
363
|
+
return await self._bulk_rethink_memory_async(rethink_memory_params)
|
348
364
|
|
349
365
|
if tool_params:
|
350
366
|
async with Pool() as pool:
|
351
367
|
return await pool.map(execute_tool_wrapper, tool_params)
|
352
368
|
|
353
369
|
@trace_method
|
354
|
-
def
|
370
|
+
async def _bulk_rethink_memory_async(self, params: List[ToolExecutionParams]) -> Sequence[Tuple[str, Tuple[str, bool]]]:
|
355
371
|
updates = {}
|
356
372
|
result = []
|
357
373
|
for param in params:
|
@@ -372,11 +388,11 @@ class LettaAgentBatch(BaseAgent):
|
|
372
388
|
# TODO: This is quite ugly and confusing - this is mostly to align with the returns of other tools
|
373
389
|
result.append((param.agent_id, ("", True)))
|
374
390
|
|
375
|
-
self.block_manager.
|
391
|
+
await self.block_manager.bulk_update_block_values_async(updates=updates, actor=self.actor)
|
376
392
|
|
377
393
|
return result
|
378
394
|
|
379
|
-
def _persist_tool_messages(
|
395
|
+
async def _persist_tool_messages(
|
380
396
|
self,
|
381
397
|
exec_results: Sequence[Tuple[str, Tuple[str, bool]]],
|
382
398
|
ctx: _ResumeContext,
|
@@ -398,7 +414,7 @@ class LettaAgentBatch(BaseAgent):
|
|
398
414
|
)
|
399
415
|
msg_map[aid] = msgs
|
400
416
|
# flatten & persist
|
401
|
-
self.message_manager.
|
417
|
+
await self.message_manager.create_many_messages_async([m for msgs in msg_map.values() for m in msgs], actor=self.actor)
|
402
418
|
return msg_map
|
403
419
|
|
404
420
|
def _mark_steps_complete(self, llm_batch_id: str, agent_ids: List[str]) -> None:
|
@@ -530,12 +546,14 @@ class LettaAgentBatch(BaseAgent):
|
|
530
546
|
valid_tool_names = tool_rules_solver.get_allowed_tool_names(available_tools=set([t.name for t in tools]))
|
531
547
|
return [enable_strict_mode(t.json_schema) for t in tools if t.name in set(valid_tool_names)]
|
532
548
|
|
533
|
-
def
|
534
|
-
|
549
|
+
async def _prepare_in_context_messages_per_agent_async(
|
550
|
+
self, agent_state: AgentState, input_messages: List[MessageCreate]
|
551
|
+
) -> List[Message]:
|
552
|
+
current_in_context_messages, new_in_context_messages = await _prepare_in_context_messages_async(
|
535
553
|
input_messages, agent_state, self.message_manager, self.actor
|
536
554
|
)
|
537
555
|
|
538
|
-
in_context_messages = self.
|
556
|
+
in_context_messages = await self._rebuild_memory_async(current_in_context_messages + new_in_context_messages, agent_state)
|
539
557
|
return in_context_messages
|
540
558
|
|
541
559
|
# TODO: Make this a bullk function
|
@@ -58,7 +58,7 @@ class VoiceSleeptimeAgent(LettaAgent):
|
|
58
58
|
def update_message_transcript(self, message_transcripts: List[str]):
|
59
59
|
self.message_transcripts = message_transcripts
|
60
60
|
|
61
|
-
async def step(self, input_messages: List[MessageCreate], max_steps: int = 20) -> LettaResponse:
|
61
|
+
async def step(self, input_messages: List[MessageCreate], max_steps: int = 20, use_assistant_message: bool = True) -> LettaResponse:
|
62
62
|
"""
|
63
63
|
Process the user's input message, allowing the model to call memory-related tools
|
64
64
|
until it decides to stop and provide a final response.
|
@@ -74,7 +74,7 @@ class VoiceSleeptimeAgent(LettaAgent):
|
|
74
74
|
]
|
75
75
|
|
76
76
|
# Summarize
|
77
|
-
current_in_context_messages, new_in_context_messages = await super()._step(
|
77
|
+
current_in_context_messages, new_in_context_messages, usage = await super()._step(
|
78
78
|
agent_state=agent_state, input_messages=input_messages, max_steps=max_steps
|
79
79
|
)
|
80
80
|
new_in_context_messages, updated = self.summarizer.summarize(
|
@@ -84,7 +84,9 @@ class VoiceSleeptimeAgent(LettaAgent):
|
|
84
84
|
agent_id=self.agent_id, message_ids=[m.id for m in new_in_context_messages], actor=self.actor
|
85
85
|
)
|
86
86
|
|
87
|
-
return _create_letta_response(
|
87
|
+
return _create_letta_response(
|
88
|
+
new_in_context_messages=new_in_context_messages, use_assistant_message=use_assistant_message, usage=usage
|
89
|
+
)
|
88
90
|
|
89
91
|
@trace_method
|
90
92
|
async def _execute_tool(self, tool_name: str, tool_args: dict, agent_state: AgentState) -> Tuple[str, bool]:
|
@@ -146,7 +148,7 @@ class VoiceSleeptimeAgent(LettaAgent):
|
|
146
148
|
return f"Failed to store memory given start_index {start_index} and end_index {end_index}: {e}", False
|
147
149
|
|
148
150
|
async def step_stream(
|
149
|
-
self, input_messages: List[MessageCreate], max_steps: int = 10, use_assistant_message: bool =
|
151
|
+
self, input_messages: List[MessageCreate], max_steps: int = 10, use_assistant_message: bool = True
|
150
152
|
) -> AsyncGenerator[Union[LettaMessage, LegacyLettaMessage, MessageStreamStatus], None]:
|
151
153
|
"""
|
152
154
|
This agent is synchronous-only. If called in an async context, raise an error.
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import asyncio
|
1
2
|
import logging
|
2
3
|
import sys
|
3
4
|
import time
|
@@ -3055,7 +3056,21 @@ class LocalClient(AbstractClient):
|
|
3055
3056
|
Returns:
|
3056
3057
|
tools (List[Tool]): List of tools
|
3057
3058
|
"""
|
3058
|
-
|
3059
|
+
# Get the current event loop or create a new one if there isn't one
|
3060
|
+
try:
|
3061
|
+
loop = asyncio.get_event_loop()
|
3062
|
+
if loop.is_running():
|
3063
|
+
# We're in an async context but can't await - use a new loop via run_coroutine_threadsafe
|
3064
|
+
concurrent_future = asyncio.run_coroutine_threadsafe(
|
3065
|
+
self.server.tool_manager.list_tools_async(actor=self.user, after=after, limit=limit), loop
|
3066
|
+
)
|
3067
|
+
return concurrent_future.result()
|
3068
|
+
else:
|
3069
|
+
# We have a loop but it's not running - we can just run the coroutine
|
3070
|
+
return loop.run_until_complete(self.server.tool_manager.list_tools_async(actor=self.user, after=after, limit=limit))
|
3071
|
+
except RuntimeError:
|
3072
|
+
# No running event loop - create a new one with asyncio.run
|
3073
|
+
return asyncio.run(self.server.tool_manager.list_tools_async(actor=self.user, after=after, limit=limit))
|
3059
3074
|
|
3060
3075
|
def get_tool(self, id: str) -> Optional[Tool]:
|
3061
3076
|
"""
|
{letta_nightly-0.7.15.dev20250515104317 → letta_nightly-0.7.17.dev20250516090339}/letta/constants.py
RENAMED
@@ -195,6 +195,9 @@ DATA_SOURCE_ATTACH_ALERT = (
|
|
195
195
|
"[ALERT] New data was just uploaded to archival memory. You can view this data by calling the archival_memory_search tool."
|
196
196
|
)
|
197
197
|
|
198
|
+
# Throw an error message when a read-only block is edited
|
199
|
+
READ_ONLY_BLOCK_EDIT_ERROR = f"{ERROR_MESSAGE_PREFIX} This block is read-only and cannot be edited."
|
200
|
+
|
198
201
|
# The ackknowledgement message used in the summarize sequence
|
199
202
|
MESSAGE_SUMMARY_REQUEST_ACK = "Understood, I will respond with a summary of the message (and only the summary, nothing else) once I receive the conversation history. I'm ready."
|
200
203
|
|
@@ -12,7 +12,7 @@ from composio.exceptions import (
|
|
12
12
|
)
|
13
13
|
|
14
14
|
|
15
|
-
class AsyncComposioToolSet(BaseComposioToolSet, runtime="letta"):
|
15
|
+
class AsyncComposioToolSet(BaseComposioToolSet, runtime="letta", description_char_limit=1024):
|
16
16
|
"""
|
17
17
|
Async version of ComposioToolSet client for interacting with Composio API
|
18
18
|
Used to asynchronously hit the execute action endpoint
|