letta-nightly 0.4.1.dev20241012104008__tar.gz → 0.4.1.dev20241014104152__tar.gz

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

Potentially problematic release.


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

Files changed (190) hide show
  1. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/PKG-INFO +1 -1
  2. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/agent.py +51 -65
  3. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/chat_completion_proxy.py +1 -3
  4. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/main.py +19 -9
  5. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/providers.py +22 -1
  6. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/server.py +80 -17
  7. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/pyproject.toml +1 -1
  8. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/LICENSE +0 -0
  9. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/README.md +0 -0
  10. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/__init__.py +0 -0
  11. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/__main__.py +0 -0
  12. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/agent_store/chroma.py +0 -0
  13. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/agent_store/db.py +0 -0
  14. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/agent_store/lancedb.py +0 -0
  15. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/agent_store/milvus.py +0 -0
  16. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/agent_store/qdrant.py +0 -0
  17. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/agent_store/storage.py +0 -0
  18. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/base.py +0 -0
  19. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/benchmark/benchmark.py +0 -0
  20. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/benchmark/constants.py +0 -0
  21. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/cli/cli.py +0 -0
  22. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/cli/cli_config.py +0 -0
  23. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/cli/cli_load.py +0 -0
  24. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/client/__init__.py +0 -0
  25. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/client/admin.py +0 -0
  26. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/client/client.py +0 -0
  27. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/client/streaming.py +0 -0
  28. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/client/utils.py +0 -0
  29. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/config.py +0 -0
  30. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/constants.py +0 -0
  31. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/credentials.py +0 -0
  32. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/data_sources/connectors.py +0 -0
  33. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/embeddings.py +0 -0
  34. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/errors.py +0 -0
  35. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/functions/__init__.py +0 -0
  36. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/functions/function_sets/base.py +0 -0
  37. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/functions/function_sets/extras.py +0 -0
  38. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/functions/functions.py +0 -0
  39. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/functions/helpers.py +0 -0
  40. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/functions/schema_generator.py +0 -0
  41. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/humans/__init__.py +0 -0
  42. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/humans/examples/basic.txt +0 -0
  43. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/humans/examples/cs_phd.txt +0 -0
  44. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/interface.py +0 -0
  45. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/llm_api/__init__.py +0 -0
  46. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/llm_api/anthropic.py +0 -0
  47. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/llm_api/azure_openai.py +0 -0
  48. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/llm_api/azure_openai_constants.py +0 -0
  49. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/llm_api/cohere.py +0 -0
  50. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/llm_api/google_ai.py +0 -0
  51. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/llm_api/helpers.py +0 -0
  52. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/llm_api/llm_api_tools.py +0 -0
  53. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/llm_api/openai.py +0 -0
  54. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/README.md +0 -0
  55. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/__init__.py +0 -0
  56. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/constants.py +0 -0
  57. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/function_parser.py +0 -0
  58. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/grammars/__init__.py +0 -0
  59. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/grammars/gbnf_grammar_generator.py +0 -0
  60. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/grammars/json.gbnf +0 -0
  61. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/grammars/json_func_calls_with_inner_thoughts.gbnf +0 -0
  62. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/json_parser.py +0 -0
  63. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/koboldcpp/api.py +0 -0
  64. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/koboldcpp/settings.py +0 -0
  65. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/llamacpp/api.py +0 -0
  66. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/llamacpp/settings.py +0 -0
  67. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/llm_chat_completion_wrappers/__init__.py +0 -0
  68. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/llm_chat_completion_wrappers/airoboros.py +0 -0
  69. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/llm_chat_completion_wrappers/chatml.py +0 -0
  70. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/llm_chat_completion_wrappers/configurable_wrapper.py +0 -0
  71. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/llm_chat_completion_wrappers/dolphin.py +0 -0
  72. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/llm_chat_completion_wrappers/llama3.py +0 -0
  73. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/llm_chat_completion_wrappers/simple_summary_wrapper.py +0 -0
  74. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/llm_chat_completion_wrappers/wrapper_base.py +0 -0
  75. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/llm_chat_completion_wrappers/zephyr.py +0 -0
  76. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/lmstudio/api.py +0 -0
  77. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/lmstudio/settings.py +0 -0
  78. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/ollama/api.py +0 -0
  79. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/ollama/settings.py +0 -0
  80. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/settings/__init__.py +0 -0
  81. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/settings/deterministic_mirostat.py +0 -0
  82. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/settings/settings.py +0 -0
  83. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/settings/simple.py +0 -0
  84. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/utils.py +0 -0
  85. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/vllm/api.py +0 -0
  86. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/webui/api.py +0 -0
  87. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/webui/legacy_api.py +0 -0
  88. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/webui/legacy_settings.py +0 -0
  89. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/local_llm/webui/settings.py +0 -0
  90. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/log.py +0 -0
  91. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/memory.py +0 -0
  92. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/metadata.py +0 -0
  93. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/openai_backcompat/__init__.py +0 -0
  94. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/openai_backcompat/openai_object.py +0 -0
  95. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/persistence_manager.py +0 -0
  96. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/personas/__init__.py +0 -0
  97. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/personas/examples/anna_pa.txt +0 -0
  98. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/personas/examples/google_search_persona.txt +0 -0
  99. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/personas/examples/memgpt_doc.txt +0 -0
  100. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/personas/examples/memgpt_starter.txt +0 -0
  101. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/personas/examples/sam.txt +0 -0
  102. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/personas/examples/sam_pov.txt +0 -0
  103. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/personas/examples/sam_simple_pov_gpt35.txt +0 -0
  104. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/personas/examples/sqldb/test.db +0 -0
  105. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/prompts/__init__.py +0 -0
  106. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/prompts/gpt_summarize.py +0 -0
  107. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/prompts/gpt_system.py +0 -0
  108. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/prompts/system/memgpt_base.txt +0 -0
  109. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/prompts/system/memgpt_chat.txt +0 -0
  110. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/prompts/system/memgpt_chat_compressed.txt +0 -0
  111. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/prompts/system/memgpt_chat_fstring.txt +0 -0
  112. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/prompts/system/memgpt_doc.txt +0 -0
  113. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/prompts/system/memgpt_gpt35_extralong.txt +0 -0
  114. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/prompts/system/memgpt_intuitive_knowledge.txt +0 -0
  115. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/prompts/system/memgpt_modified_chat.txt +0 -0
  116. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/pytest.ini +0 -0
  117. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/agent.py +0 -0
  118. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/api_key.py +0 -0
  119. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/block.py +0 -0
  120. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/document.py +0 -0
  121. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/embedding_config.py +0 -0
  122. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/enums.py +0 -0
  123. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/health.py +0 -0
  124. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/job.py +0 -0
  125. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/letta_base.py +0 -0
  126. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/letta_message.py +0 -0
  127. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/letta_request.py +0 -0
  128. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/letta_response.py +0 -0
  129. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/llm_config.py +0 -0
  130. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/memory.py +0 -0
  131. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/message.py +0 -0
  132. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/openai/chat_completion_request.py +0 -0
  133. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/openai/chat_completion_response.py +0 -0
  134. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/openai/chat_completions.py +0 -0
  135. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/openai/embedding_response.py +0 -0
  136. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/openai/openai.py +0 -0
  137. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/organization.py +0 -0
  138. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/passage.py +0 -0
  139. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/source.py +0 -0
  140. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/tool.py +0 -0
  141. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/usage.py +0 -0
  142. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/schemas/user.py +0 -0
  143. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/__init__.py +0 -0
  144. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/constants.py +0 -0
  145. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/__init__.py +0 -0
  146. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/admin/__init__.py +0 -0
  147. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/admin/agents.py +0 -0
  148. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/admin/tools.py +0 -0
  149. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/admin/users.py +0 -0
  150. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/app.py +0 -0
  151. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/auth/__init__.py +0 -0
  152. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/auth/index.py +0 -0
  153. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/auth_token.py +0 -0
  154. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/interface.py +0 -0
  155. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/__init__.py +0 -0
  156. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/openai/__init__.py +0 -0
  157. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/openai/assistants/__init__.py +0 -0
  158. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/openai/assistants/assistants.py +0 -0
  159. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/openai/assistants/schemas.py +0 -0
  160. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/openai/assistants/threads.py +0 -0
  161. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/openai/chat_completions/__init__.py +0 -0
  162. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +0 -0
  163. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/v1/__init__.py +0 -0
  164. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/v1/agents.py +0 -0
  165. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/v1/blocks.py +0 -0
  166. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/v1/health.py +0 -0
  167. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/v1/jobs.py +0 -0
  168. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/v1/llms.py +0 -0
  169. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/v1/organizations.py +0 -0
  170. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/v1/sources.py +0 -0
  171. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/v1/tools.py +0 -0
  172. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/routers/v1/users.py +0 -0
  173. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/static_files.py +0 -0
  174. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/rest_api/utils.py +0 -0
  175. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/startup.sh +0 -0
  176. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/static_files/assets/index-3ab03d5b.css +0 -0
  177. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/static_files/assets/index-9a9c449b.js +0 -0
  178. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/static_files/favicon.ico +0 -0
  179. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/static_files/index.html +0 -0
  180. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/static_files/memgpt_logo_transparent.png +0 -0
  181. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/utils.py +0 -0
  182. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/ws_api/__init__.py +0 -0
  183. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/ws_api/example_client.py +0 -0
  184. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/ws_api/interface.py +0 -0
  185. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/ws_api/protocol.py +0 -0
  186. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/server/ws_api/server.py +0 -0
  187. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/settings.py +0 -0
  188. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/streaming_interface.py +0 -0
  189. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/system.py +0 -0
  190. {letta_nightly-0.4.1.dev20241012104008 → letta_nightly-0.4.1.dev20241014104152}/letta/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: letta-nightly
3
- Version: 0.4.1.dev20241012104008
3
+ Version: 0.4.1.dev20241014104152
4
4
  Summary: Create LLM agents with long-term memory and custom tools
5
5
  License: Apache License
6
6
  Author: Letta Team
@@ -39,6 +39,7 @@ from letta.system import (
39
39
  get_login_event,
40
40
  package_function_response,
41
41
  package_summarize_message,
42
+ package_user_message,
42
43
  )
43
44
  from letta.utils import (
44
45
  count_tokens,
@@ -200,16 +201,7 @@ class BaseAgent(ABC):
200
201
  @abstractmethod
201
202
  def step(
202
203
  self,
203
- messages: Union[Message, List[Message], str], # TODO deprecate str inputs
204
- first_message: bool = False,
205
- first_message_retry_limit: int = FIRST_MESSAGE_ATTEMPTS,
206
- skip_verify: bool = False,
207
- return_dicts: bool = True, # if True, return dicts, if False, return Message objects
208
- recreate_message_timestamp: bool = True, # if True, when input is a Message type, recreated the 'created_at' field
209
- stream: bool = False, # TODO move to config?
210
- timestamp: Optional[datetime.datetime] = None,
211
- inner_thoughts_in_kwargs_option: OptionState = OptionState.DEFAULT,
212
- ms: Optional[MetadataStore] = None,
204
+ messages: Union[Message, List[Message]],
213
205
  ) -> AgentStepResponse:
214
206
  """
215
207
  Top-level event message handler for the agent.
@@ -730,14 +722,13 @@ class Agent(BaseAgent):
730
722
 
731
723
  def step(
732
724
  self,
733
- user_message: Union[Message, None, str], # NOTE: should be json.dump(dict)
725
+ messages: Union[Message, List[Message]],
734
726
  first_message: bool = False,
735
727
  first_message_retry_limit: int = FIRST_MESSAGE_ATTEMPTS,
736
728
  skip_verify: bool = False,
737
729
  return_dicts: bool = True,
738
- recreate_message_timestamp: bool = True, # if True, when input is a Message type, recreated the 'created_at' field
730
+ # recreate_message_timestamp: bool = True, # if True, when input is a Message type, recreated the 'created_at' field
739
731
  stream: bool = False, # TODO move to config?
740
- timestamp: Optional[datetime.datetime] = None,
741
732
  inner_thoughts_in_kwargs_option: OptionState = OptionState.DEFAULT,
742
733
  ms: Optional[MetadataStore] = None,
743
734
  ) -> AgentStepResponse:
@@ -760,50 +751,13 @@ class Agent(BaseAgent):
760
751
  self.rebuild_memory(force=True, ms=ms)
761
752
 
762
753
  # Step 1: add user message
763
- if user_message is not None:
764
- if isinstance(user_message, Message):
765
- assert user_message.text is not None
766
-
767
- # Validate JSON via save/load
768
- user_message_text = validate_json(user_message.text)
769
- cleaned_user_message_text, name = strip_name_field_from_user_message(user_message_text)
770
-
771
- if name is not None:
772
- # Update Message object
773
- user_message.text = cleaned_user_message_text
774
- user_message.name = name
754
+ if isinstance(messages, Message):
755
+ messages = [messages]
775
756
 
776
- # Recreate timestamp
777
- if recreate_message_timestamp:
778
- user_message.created_at = get_utc_time()
757
+ if not all(isinstance(m, Message) for m in messages):
758
+ raise ValueError(f"messages should be a Message or a list of Message, got {type(messages)}")
779
759
 
780
- elif isinstance(user_message, str):
781
- # Validate JSON via save/load
782
- user_message = validate_json(user_message)
783
- cleaned_user_message_text, name = strip_name_field_from_user_message(user_message)
784
-
785
- # If user_message['name'] is not None, it will be handled properly by dict_to_message
786
- # So no need to run strip_name_field_from_user_message
787
-
788
- # Create the associated Message object (in the database)
789
- user_message = Message.dict_to_message(
790
- agent_id=self.agent_state.id,
791
- user_id=self.agent_state.user_id,
792
- model=self.model,
793
- openai_message_dict={"role": "user", "content": cleaned_user_message_text, "name": name},
794
- created_at=timestamp,
795
- )
796
-
797
- else:
798
- raise ValueError(f"Bad type for user_message: {type(user_message)}")
799
-
800
- self.interface.user_message(user_message.text, msg_obj=user_message)
801
-
802
- input_message_sequence = self._messages + [user_message]
803
-
804
- # Alternatively, the requestor can send an empty user message
805
- else:
806
- input_message_sequence = self._messages
760
+ input_message_sequence = self._messages + messages
807
761
 
808
762
  if len(input_message_sequence) > 1 and input_message_sequence[-1].role != "user":
809
763
  printd(f"{CLI_WARNING_PREFIX}Attempting to run ChatCompletion without user as the last message in the queue")
@@ -846,11 +800,8 @@ class Agent(BaseAgent):
846
800
  )
847
801
 
848
802
  # Step 6: extend the message history
849
- if user_message is not None:
850
- if isinstance(user_message, Message):
851
- all_new_messages = [user_message] + all_response_messages
852
- else:
853
- raise ValueError(type(user_message))
803
+ if len(messages) > 0:
804
+ all_new_messages = messages + all_response_messages
854
805
  else:
855
806
  all_new_messages = all_response_messages
856
807
 
@@ -897,7 +848,7 @@ class Agent(BaseAgent):
897
848
  )
898
849
 
899
850
  except Exception as e:
900
- printd(f"step() failed\nuser_message = {user_message}\nerror = {e}")
851
+ printd(f"step() failed\nmessages = {messages}\nerror = {e}")
901
852
 
902
853
  # If we got a context alert, try trimming the messages length, then try again
903
854
  if is_context_overflow_error(e):
@@ -906,14 +857,14 @@ class Agent(BaseAgent):
906
857
 
907
858
  # Try step again
908
859
  return self.step(
909
- user_message,
860
+ messages=messages,
910
861
  first_message=first_message,
911
862
  first_message_retry_limit=first_message_retry_limit,
912
863
  skip_verify=skip_verify,
913
864
  return_dicts=return_dicts,
914
- recreate_message_timestamp=recreate_message_timestamp,
865
+ # recreate_message_timestamp=recreate_message_timestamp,
915
866
  stream=stream,
916
- timestamp=timestamp,
867
+ # timestamp=timestamp,
917
868
  inner_thoughts_in_kwargs_option=inner_thoughts_in_kwargs_option,
918
869
  ms=ms,
919
870
  )
@@ -922,6 +873,40 @@ class Agent(BaseAgent):
922
873
  printd(f"step() failed with an unrecognized exception: '{str(e)}'")
923
874
  raise e
924
875
 
876
+ def step_user_message(self, user_message_str: str, **kwargs) -> AgentStepResponse:
877
+ """Takes a basic user message string, turns it into a stringified JSON with extra metadata, then sends it to the agent
878
+
879
+ Example:
880
+ -> user_message_str = 'hi'
881
+ -> {'message': 'hi', 'type': 'user_message', ...}
882
+ -> json.dumps(...)
883
+ -> agent.step(messages=[Message(role='user', text=...)])
884
+ """
885
+ # Wrap with metadata, dumps to JSON
886
+ assert user_message_str and isinstance(
887
+ user_message_str, str
888
+ ), f"user_message_str should be a non-empty string, got {type(user_message_str)}"
889
+ user_message_json_str = package_user_message(user_message_str)
890
+
891
+ # Validate JSON via save/load
892
+ user_message = validate_json(user_message_json_str)
893
+ cleaned_user_message_text, name = strip_name_field_from_user_message(user_message)
894
+
895
+ # Turn into a dict
896
+ openai_message_dict = {"role": "user", "content": cleaned_user_message_text, "name": name}
897
+
898
+ # Create the associated Message object (in the database)
899
+ assert self.agent_state.user_id is not None, "User ID is not set"
900
+ user_message = Message.dict_to_message(
901
+ agent_id=self.agent_state.id,
902
+ user_id=self.agent_state.user_id,
903
+ model=self.model,
904
+ openai_message_dict=openai_message_dict,
905
+ # created_at=timestamp,
906
+ )
907
+
908
+ return self.step(messages=[user_message], **kwargs)
909
+
925
910
  def summarize_messages_inplace(self, cutoff=None, preserve_last_N_messages=True, disallow_tool_as_first=True):
926
911
  assert self.messages[0]["role"] == "system", f"self.messages[0] should be system (instead got {self.messages[0]})"
927
912
 
@@ -1340,7 +1325,8 @@ class Agent(BaseAgent):
1340
1325
 
1341
1326
  self.pop_until_user()
1342
1327
  user_message = self.pop_message(count=1)[0]
1343
- step_response = self.step(user_message=user_message.text, return_dicts=False)
1328
+ assert user_message.text is not None, "User message text is None"
1329
+ step_response = self.step_user_message(user_message_str=user_message.text, return_dicts=False)
1344
1330
  messages = step_response.messages
1345
1331
 
1346
1332
  assert messages is not None
@@ -85,9 +85,7 @@ def get_chat_completion(
85
85
  elif wrapper is None:
86
86
  # Warn the user that we're using the fallback
87
87
  if not has_shown_warning:
88
- print(
89
- f"{CLI_WARNING_PREFIX}no wrapper specified for local LLM, using the default wrapper (you can remove this warning by specifying the wrapper with --model-wrapper)"
90
- )
88
+ print(f"{CLI_WARNING_PREFIX}no prompt formatter specified for local LLM, using the default formatter")
91
89
  has_shown_warning = True
92
90
 
93
91
  llm_wrapper = DEFAULT_WRAPPER()
@@ -356,19 +356,29 @@ def run_agent_loop(
356
356
  else:
357
357
  # If message did not begin with command prefix, pass inputs to Letta
358
358
  # Handle user message and append to messages
359
- user_message = system.package_user_message(user_input)
359
+ user_message = str(user_input)
360
360
 
361
361
  skip_next_user_input = False
362
362
 
363
363
  def process_agent_step(user_message, no_verify):
364
- step_response = letta_agent.step(
365
- user_message,
366
- first_message=False,
367
- skip_verify=no_verify,
368
- stream=stream,
369
- inner_thoughts_in_kwargs_option=inner_thoughts_in_kwargs,
370
- ms=ms,
371
- )
364
+ if user_message is None:
365
+ step_response = letta_agent.step(
366
+ messages=[],
367
+ first_message=False,
368
+ skip_verify=no_verify,
369
+ stream=stream,
370
+ inner_thoughts_in_kwargs_option=inner_thoughts_in_kwargs,
371
+ ms=ms,
372
+ )
373
+ else:
374
+ step_response = letta_agent.step_user_message(
375
+ user_message_str=user_message,
376
+ first_message=False,
377
+ skip_verify=no_verify,
378
+ stream=stream,
379
+ inner_thoughts_in_kwargs_option=inner_thoughts_in_kwargs,
380
+ ms=ms,
381
+ )
372
382
  new_messages = step_response.messages
373
383
  heartbeat_request = step_response.heartbeat_request
374
384
  function_failed = step_response.function_failed
@@ -140,9 +140,17 @@ class AnthropicProvider(Provider):
140
140
 
141
141
 
142
142
  class OllamaProvider(OpenAIProvider):
143
+ """Ollama provider that uses the native /api/generate endpoint
144
+
145
+ See: https://github.com/ollama/ollama/blob/main/docs/api.md#generate-a-completion
146
+ """
147
+
143
148
  name: str = "ollama"
144
149
  base_url: str = Field(..., description="Base URL for the Ollama API.")
145
150
  api_key: Optional[str] = Field(None, description="API key for the Ollama API (default: `None`).")
151
+ default_prompt_formatter: str = Field(
152
+ ..., description="Default prompt formatter (aka model wrapper) to use on a /completions style API."
153
+ )
146
154
 
147
155
  def list_llm_models(self) -> List[LLMConfig]:
148
156
  # https://github.com/ollama/ollama/blob/main/docs/api.md#list-local-models
@@ -156,11 +164,15 @@ class OllamaProvider(OpenAIProvider):
156
164
  configs = []
157
165
  for model in response_json["models"]:
158
166
  context_window = self.get_model_context_window(model["name"])
167
+ if context_window is None:
168
+ print(f"Ollama model {model['name']} has no context window")
169
+ continue
159
170
  configs.append(
160
171
  LLMConfig(
161
172
  model=model["name"],
162
173
  model_endpoint_type="ollama",
163
174
  model_endpoint=self.base_url,
175
+ model_wrapper=self.default_prompt_formatter,
164
176
  context_window=context_window,
165
177
  )
166
178
  )
@@ -192,6 +204,10 @@ class OllamaProvider(OpenAIProvider):
192
204
  # ]
193
205
  # max_position_embeddings
194
206
  # parse model cards: nous, dolphon, llama
207
+ if "model_info" not in response_json:
208
+ if "error" in response_json:
209
+ print(f"Ollama fetch model info error for {model_name}: {response_json['error']}")
210
+ return None
195
211
  for key, value in response_json["model_info"].items():
196
212
  if "context_length" in key:
197
213
  return value
@@ -202,6 +218,10 @@ class OllamaProvider(OpenAIProvider):
202
218
 
203
219
  response = requests.post(f"{self.base_url}/api/show", json={"name": model_name, "verbose": True})
204
220
  response_json = response.json()
221
+ if "model_info" not in response_json:
222
+ if "error" in response_json:
223
+ print(f"Ollama fetch model info error for {model_name}: {response_json['error']}")
224
+ return None
205
225
  for key, value in response_json["model_info"].items():
206
226
  if "embedding_length" in key:
207
227
  return value
@@ -220,6 +240,7 @@ class OllamaProvider(OpenAIProvider):
220
240
  for model in response_json["models"]:
221
241
  embedding_dim = self.get_model_embedding_dim(model["name"])
222
242
  if not embedding_dim:
243
+ print(f"Ollama model {model['name']} has no embedding dimension")
223
244
  continue
224
245
  configs.append(
225
246
  EmbeddingConfig(
@@ -420,7 +441,7 @@ class VLLMCompletionsProvider(Provider):
420
441
  # NOTE: vLLM only serves one model at a time (so could configure that through env variables)
421
442
  name: str = "vllm"
422
443
  base_url: str = Field(..., description="Base URL for the vLLM API.")
423
- default_prompt_formatter: str = Field(..., description="Default prompt formatter (aka model wrapper)to use on vLLM /completions API.")
444
+ default_prompt_formatter: str = Field(..., description="Default prompt formatter (aka model wrapper) to use on vLLM /completions API.")
424
445
 
425
446
  def list_llm_models(self) -> List[LLMConfig]:
426
447
  # not supported with vLLM
@@ -200,7 +200,7 @@ class SyncServer(Server):
200
200
  def __init__(
201
201
  self,
202
202
  chaining: bool = True,
203
- max_chaining_steps: bool = None,
203
+ max_chaining_steps: Optional[bool] = None,
204
204
  default_interface_factory: Callable[[], AgentInterface] = lambda: CLIInterface(),
205
205
  # default_interface: AgentInterface = CLIInterface(),
206
206
  # default_persistence_manager_cls: PersistenceManager = LocalStateManager,
@@ -241,13 +241,32 @@ class SyncServer(Server):
241
241
  # collect providers (always has Letta as a default)
242
242
  self._enabled_providers: List[Provider] = [LettaProvider()]
243
243
  if model_settings.openai_api_key:
244
- self._enabled_providers.append(OpenAIProvider(api_key=model_settings.openai_api_key, base_url=model_settings.openai_api_base))
244
+ self._enabled_providers.append(
245
+ OpenAIProvider(
246
+ api_key=model_settings.openai_api_key,
247
+ base_url=model_settings.openai_api_base,
248
+ )
249
+ )
245
250
  if model_settings.anthropic_api_key:
246
- self._enabled_providers.append(AnthropicProvider(api_key=model_settings.anthropic_api_key))
251
+ self._enabled_providers.append(
252
+ AnthropicProvider(
253
+ api_key=model_settings.anthropic_api_key,
254
+ )
255
+ )
247
256
  if model_settings.ollama_base_url:
248
- self._enabled_providers.append(OllamaProvider(base_url=model_settings.ollama_base_url, api_key=None))
257
+ self._enabled_providers.append(
258
+ OllamaProvider(
259
+ base_url=model_settings.ollama_base_url,
260
+ api_key=None,
261
+ default_prompt_formatter=model_settings.default_prompt_formatter,
262
+ )
263
+ )
249
264
  if model_settings.gemini_api_key:
250
- self._enabled_providers.append(GoogleAIProvider(api_key=model_settings.gemini_api_key))
265
+ self._enabled_providers.append(
266
+ GoogleAIProvider(
267
+ api_key=model_settings.gemini_api_key,
268
+ )
269
+ )
251
270
  if model_settings.azure_api_key and model_settings.azure_base_url:
252
271
  assert model_settings.azure_api_version, "AZURE_API_VERSION is required"
253
272
  self._enabled_providers.append(
@@ -268,7 +287,11 @@ class SyncServer(Server):
268
287
  # NOTE: to use the /chat/completions endpoint, you need to specify extra flags on vLLM startup
269
288
  # see: https://docs.vllm.ai/en/latest/getting_started/examples/openai_chat_completion_client_with_tools.html
270
289
  # e.g. "... --enable-auto-tool-choice --tool-call-parser hermes"
271
- self._enabled_providers.append(VLLMChatCompletionsProvider(base_url=model_settings.vllm_api_base))
290
+ self._enabled_providers.append(
291
+ VLLMChatCompletionsProvider(
292
+ base_url=model_settings.vllm_api_base,
293
+ )
294
+ )
272
295
 
273
296
  def save_agents(self):
274
297
  """Saves all the agents that are in the in-memory object store"""
@@ -360,9 +383,22 @@ class SyncServer(Server):
360
383
  letta_agent = self._load_agent(user_id=user_id, agent_id=agent_id)
361
384
  return letta_agent
362
385
 
363
- def _step(self, user_id: str, agent_id: str, input_message: Union[str, Message], timestamp: Optional[datetime]) -> LettaUsageStatistics:
386
+ def _step(
387
+ self,
388
+ user_id: str,
389
+ agent_id: str,
390
+ input_messages: Union[Message, List[Message]],
391
+ # timestamp: Optional[datetime],
392
+ ) -> LettaUsageStatistics:
364
393
  """Send the input message through the agent"""
365
- logger.debug(f"Got input message: {input_message}")
394
+
395
+ # Input validation
396
+ if isinstance(input_messages, Message):
397
+ input_messages = [input_messages]
398
+ if not all(isinstance(m, Message) for m in input_messages):
399
+ raise ValueError(f"messages should be a Message or a list of Message, got {type(input_messages)}")
400
+
401
+ logger.debug(f"Got input messages: {input_messages}")
366
402
  try:
367
403
 
368
404
  # Get the agent object (loaded in memory)
@@ -375,18 +411,18 @@ class SyncServer(Server):
375
411
 
376
412
  logger.debug(f"Starting agent step")
377
413
  no_verify = True
378
- next_input_message = input_message
414
+ next_input_message = input_messages
379
415
  counter = 0
380
416
  total_usage = UsageStatistics()
381
417
  step_count = 0
382
418
  while True:
383
419
  step_response = letta_agent.step(
384
- next_input_message,
420
+ messages=next_input_message,
385
421
  first_message=False,
386
422
  skip_verify=no_verify,
387
423
  return_dicts=False,
388
424
  stream=token_streaming,
389
- timestamp=timestamp,
425
+ # timestamp=timestamp,
390
426
  ms=self.ms,
391
427
  )
392
428
  step_response.messages
@@ -413,13 +449,40 @@ class SyncServer(Server):
413
449
  break
414
450
  # Chain handlers
415
451
  elif token_warning:
416
- next_input_message = system.get_token_limit_warning()
452
+ assert letta_agent.agent_state.user_id is not None
453
+ next_input_message = Message.dict_to_message(
454
+ agent_id=letta_agent.agent_state.id,
455
+ user_id=letta_agent.agent_state.user_id,
456
+ model=letta_agent.model,
457
+ openai_message_dict={
458
+ "role": "user", # TODO: change to system?
459
+ "content": system.get_token_limit_warning(),
460
+ },
461
+ )
417
462
  continue # always chain
418
463
  elif function_failed:
419
- next_input_message = system.get_heartbeat(constants.FUNC_FAILED_HEARTBEAT_MESSAGE)
464
+ assert letta_agent.agent_state.user_id is not None
465
+ next_input_message = Message.dict_to_message(
466
+ agent_id=letta_agent.agent_state.id,
467
+ user_id=letta_agent.agent_state.user_id,
468
+ model=letta_agent.model,
469
+ openai_message_dict={
470
+ "role": "user", # TODO: change to system?
471
+ "content": system.get_heartbeat(constants.FUNC_FAILED_HEARTBEAT_MESSAGE),
472
+ },
473
+ )
420
474
  continue # always chain
421
475
  elif heartbeat_request:
422
- next_input_message = system.get_heartbeat(constants.REQ_HEARTBEAT_MESSAGE)
476
+ assert letta_agent.agent_state.user_id is not None
477
+ next_input_message = Message.dict_to_message(
478
+ agent_id=letta_agent.agent_state.id,
479
+ user_id=letta_agent.agent_state.user_id,
480
+ model=letta_agent.model,
481
+ openai_message_dict={
482
+ "role": "user", # TODO: change to system?
483
+ "content": system.get_heartbeat(constants.REQ_HEARTBEAT_MESSAGE),
484
+ },
485
+ )
423
486
  continue # always chain
424
487
  # Letta no-op / yield
425
488
  else:
@@ -598,7 +661,7 @@ class SyncServer(Server):
598
661
  )
599
662
 
600
663
  # Run the agent state forward
601
- usage = self._step(user_id=user_id, agent_id=agent_id, input_message=message, timestamp=timestamp)
664
+ usage = self._step(user_id=user_id, agent_id=agent_id, input_messages=message)
602
665
  return usage
603
666
 
604
667
  def system_message(
@@ -646,7 +709,7 @@ class SyncServer(Server):
646
709
 
647
710
  if isinstance(message, Message):
648
711
  # Can't have a null text field
649
- if len(message.text) == 0 or message.text is None:
712
+ if message.text is None or len(message.text) == 0:
650
713
  raise ValueError(f"Invalid input: '{message.text}'")
651
714
  # If the input begins with a command prefix, reject
652
715
  elif message.text.startswith("/"):
@@ -660,7 +723,7 @@ class SyncServer(Server):
660
723
  message.created_at = timestamp
661
724
 
662
725
  # Run the agent state forward
663
- return self._step(user_id=user_id, agent_id=agent_id, input_message=packaged_system_message, timestamp=timestamp)
726
+ return self._step(user_id=user_id, agent_id=agent_id, input_messages=message)
664
727
 
665
728
  # @LockingServer.agent_lock_decorator
666
729
  def run_command(self, user_id: str, agent_id: str, command: str) -> LettaUsageStatistics:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "letta-nightly"
3
- version = "0.4.1.dev20241012104008"
3
+ version = "0.4.1.dev20241014104152"
4
4
  packages = [
5
5
  {include = "letta"}
6
6
  ]