letta-nightly 0.11.7.dev20251007104119__py3-none-any.whl → 0.11.7.dev20251008104128__py3-none-any.whl

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.
Files changed (145) hide show
  1. letta/adapters/letta_llm_adapter.py +1 -0
  2. letta/adapters/letta_llm_request_adapter.py +0 -1
  3. letta/adapters/letta_llm_stream_adapter.py +7 -2
  4. letta/adapters/simple_llm_request_adapter.py +88 -0
  5. letta/adapters/simple_llm_stream_adapter.py +192 -0
  6. letta/agents/agent_loop.py +6 -0
  7. letta/agents/ephemeral_summary_agent.py +2 -1
  8. letta/agents/helpers.py +142 -6
  9. letta/agents/letta_agent.py +13 -33
  10. letta/agents/letta_agent_batch.py +2 -4
  11. letta/agents/letta_agent_v2.py +87 -77
  12. letta/agents/letta_agent_v3.py +899 -0
  13. letta/agents/voice_agent.py +2 -6
  14. letta/constants.py +8 -4
  15. letta/errors.py +40 -0
  16. letta/functions/function_sets/base.py +84 -4
  17. letta/functions/function_sets/multi_agent.py +0 -3
  18. letta/functions/schema_generator.py +113 -71
  19. letta/groups/dynamic_multi_agent.py +3 -2
  20. letta/groups/helpers.py +1 -2
  21. letta/groups/round_robin_multi_agent.py +3 -2
  22. letta/groups/sleeptime_multi_agent.py +3 -2
  23. letta/groups/sleeptime_multi_agent_v2.py +1 -1
  24. letta/groups/sleeptime_multi_agent_v3.py +17 -17
  25. letta/groups/supervisor_multi_agent.py +84 -80
  26. letta/helpers/converters.py +3 -0
  27. letta/helpers/message_helper.py +4 -0
  28. letta/helpers/tool_rule_solver.py +92 -5
  29. letta/interfaces/anthropic_streaming_interface.py +409 -0
  30. letta/interfaces/gemini_streaming_interface.py +296 -0
  31. letta/interfaces/openai_streaming_interface.py +752 -1
  32. letta/llm_api/anthropic_client.py +126 -16
  33. letta/llm_api/bedrock_client.py +4 -2
  34. letta/llm_api/deepseek_client.py +4 -1
  35. letta/llm_api/google_vertex_client.py +123 -42
  36. letta/llm_api/groq_client.py +4 -1
  37. letta/llm_api/llm_api_tools.py +11 -4
  38. letta/llm_api/llm_client_base.py +6 -2
  39. letta/llm_api/openai.py +32 -2
  40. letta/llm_api/openai_client.py +423 -18
  41. letta/llm_api/xai_client.py +4 -1
  42. letta/main.py +9 -5
  43. letta/memory.py +1 -0
  44. letta/orm/__init__.py +1 -1
  45. letta/orm/agent.py +10 -0
  46. letta/orm/block.py +7 -16
  47. letta/orm/blocks_agents.py +8 -2
  48. letta/orm/files_agents.py +2 -0
  49. letta/orm/job.py +7 -5
  50. letta/orm/mcp_oauth.py +1 -0
  51. letta/orm/message.py +21 -6
  52. letta/orm/organization.py +2 -0
  53. letta/orm/provider.py +6 -2
  54. letta/orm/run.py +71 -0
  55. letta/orm/sandbox_config.py +7 -1
  56. letta/orm/sqlalchemy_base.py +0 -306
  57. letta/orm/step.py +6 -5
  58. letta/orm/step_metrics.py +5 -5
  59. letta/otel/tracing.py +28 -3
  60. letta/plugins/defaults.py +4 -4
  61. letta/prompts/system_prompts/__init__.py +2 -0
  62. letta/prompts/system_prompts/letta_v1.py +25 -0
  63. letta/schemas/agent.py +3 -2
  64. letta/schemas/agent_file.py +9 -3
  65. letta/schemas/block.py +23 -10
  66. letta/schemas/enums.py +21 -2
  67. letta/schemas/job.py +17 -4
  68. letta/schemas/letta_message_content.py +71 -2
  69. letta/schemas/letta_stop_reason.py +5 -5
  70. letta/schemas/llm_config.py +53 -3
  71. letta/schemas/memory.py +1 -1
  72. letta/schemas/message.py +504 -117
  73. letta/schemas/openai/responses_request.py +64 -0
  74. letta/schemas/providers/__init__.py +2 -0
  75. letta/schemas/providers/anthropic.py +16 -0
  76. letta/schemas/providers/ollama.py +115 -33
  77. letta/schemas/providers/openrouter.py +52 -0
  78. letta/schemas/providers/vllm.py +2 -1
  79. letta/schemas/run.py +48 -42
  80. letta/schemas/step.py +2 -2
  81. letta/schemas/step_metrics.py +1 -1
  82. letta/schemas/tool.py +15 -107
  83. letta/schemas/tool_rule.py +88 -5
  84. letta/serialize_schemas/marshmallow_agent.py +1 -0
  85. letta/server/db.py +86 -408
  86. letta/server/rest_api/app.py +61 -10
  87. letta/server/rest_api/dependencies.py +14 -0
  88. letta/server/rest_api/redis_stream_manager.py +19 -8
  89. letta/server/rest_api/routers/v1/agents.py +364 -292
  90. letta/server/rest_api/routers/v1/blocks.py +14 -20
  91. letta/server/rest_api/routers/v1/identities.py +45 -110
  92. letta/server/rest_api/routers/v1/internal_templates.py +21 -0
  93. letta/server/rest_api/routers/v1/jobs.py +23 -6
  94. letta/server/rest_api/routers/v1/messages.py +1 -1
  95. letta/server/rest_api/routers/v1/runs.py +126 -85
  96. letta/server/rest_api/routers/v1/sandbox_configs.py +10 -19
  97. letta/server/rest_api/routers/v1/tools.py +281 -594
  98. letta/server/rest_api/routers/v1/voice.py +1 -1
  99. letta/server/rest_api/streaming_response.py +29 -29
  100. letta/server/rest_api/utils.py +122 -64
  101. letta/server/server.py +160 -887
  102. letta/services/agent_manager.py +236 -919
  103. letta/services/agent_serialization_manager.py +16 -0
  104. letta/services/archive_manager.py +0 -100
  105. letta/services/block_manager.py +211 -168
  106. letta/services/file_manager.py +1 -1
  107. letta/services/files_agents_manager.py +24 -33
  108. letta/services/group_manager.py +0 -142
  109. letta/services/helpers/agent_manager_helper.py +7 -2
  110. letta/services/helpers/run_manager_helper.py +85 -0
  111. letta/services/job_manager.py +96 -411
  112. letta/services/lettuce/__init__.py +6 -0
  113. letta/services/lettuce/lettuce_client_base.py +86 -0
  114. letta/services/mcp_manager.py +38 -6
  115. letta/services/message_manager.py +165 -362
  116. letta/services/organization_manager.py +0 -36
  117. letta/services/passage_manager.py +0 -345
  118. letta/services/provider_manager.py +0 -80
  119. letta/services/run_manager.py +301 -0
  120. letta/services/sandbox_config_manager.py +0 -234
  121. letta/services/step_manager.py +62 -39
  122. letta/services/summarizer/summarizer.py +9 -7
  123. letta/services/telemetry_manager.py +0 -16
  124. letta/services/tool_executor/builtin_tool_executor.py +35 -0
  125. letta/services/tool_executor/core_tool_executor.py +397 -2
  126. letta/services/tool_executor/files_tool_executor.py +3 -3
  127. letta/services/tool_executor/multi_agent_tool_executor.py +30 -15
  128. letta/services/tool_executor/tool_execution_manager.py +6 -8
  129. letta/services/tool_executor/tool_executor_base.py +3 -3
  130. letta/services/tool_manager.py +85 -339
  131. letta/services/tool_sandbox/base.py +24 -13
  132. letta/services/tool_sandbox/e2b_sandbox.py +16 -1
  133. letta/services/tool_schema_generator.py +123 -0
  134. letta/services/user_manager.py +0 -99
  135. letta/settings.py +20 -4
  136. {letta_nightly-0.11.7.dev20251007104119.dist-info → letta_nightly-0.11.7.dev20251008104128.dist-info}/METADATA +3 -5
  137. {letta_nightly-0.11.7.dev20251007104119.dist-info → letta_nightly-0.11.7.dev20251008104128.dist-info}/RECORD +140 -132
  138. letta/agents/temporal/activities/__init__.py +0 -4
  139. letta/agents/temporal/activities/example_activity.py +0 -7
  140. letta/agents/temporal/activities/prepare_messages.py +0 -10
  141. letta/agents/temporal/temporal_agent_workflow.py +0 -56
  142. letta/agents/temporal/types.py +0 -25
  143. {letta_nightly-0.11.7.dev20251007104119.dist-info → letta_nightly-0.11.7.dev20251008104128.dist-info}/WHEEL +0 -0
  144. {letta_nightly-0.11.7.dev20251007104119.dist-info → letta_nightly-0.11.7.dev20251008104128.dist-info}/entry_points.txt +0 -0
  145. {letta_nightly-0.11.7.dev20251007104119.dist-info → letta_nightly-0.11.7.dev20251008104128.dist-info}/licenses/LICENSE +0 -0
@@ -7,24 +7,38 @@ if TYPE_CHECKING:
7
7
  from letta.server.server import SyncServer
8
8
 
9
9
 
10
+ class ExperimentalParams(BaseModel):
11
+ """Experimental parameters used across REST API endpoints."""
12
+
13
+ message_async: Optional[bool] = None
14
+ letta_v1_agent: Optional[bool] = None
15
+
16
+
10
17
  class HeaderParams(BaseModel):
11
18
  """Common header parameters used across REST API endpoints."""
12
19
 
13
20
  actor_id: Optional[str] = None
14
21
  user_agent: Optional[str] = None
15
22
  project_id: Optional[str] = None
23
+ experimental_params: Optional[ExperimentalParams] = None
16
24
 
17
25
 
18
26
  def get_headers(
19
27
  actor_id: Optional[str] = Header(None, alias="user_id"),
20
28
  user_agent: Optional[str] = Header(None, alias="User-Agent"),
21
29
  project_id: Optional[str] = Header(None, alias="X-Project-Id"),
30
+ message_async: Optional[str] = Header(None, alias="X-Experimental-Message-Async"),
31
+ letta_v1_agent: Optional[str] = Header(None, alias="X-Experimental-Letta-V1-Agent"),
22
32
  ) -> HeaderParams:
23
33
  """Dependency injection function to extract common headers from requests."""
24
34
  return HeaderParams(
25
35
  actor_id=actor_id,
26
36
  user_agent=user_agent,
27
37
  project_id=project_id,
38
+ experimental_params=ExperimentalParams(
39
+ message_async=(message_async == "true") if message_async else None,
40
+ letta_v1_agent=(letta_v1_agent == "true") if letta_v1_agent else None,
41
+ ),
28
42
  )
29
43
 
30
44
 
@@ -8,9 +8,11 @@ from typing import AsyncIterator, Dict, List, Optional
8
8
 
9
9
  from letta.data_sources.redis_client import AsyncRedisClient
10
10
  from letta.log import get_logger
11
- from letta.schemas.enums import JobStatus
11
+ from letta.schemas.enums import RunStatus
12
+ from letta.schemas.letta_stop_reason import StopReasonType
13
+ from letta.schemas.run import RunUpdate
12
14
  from letta.schemas.user import User
13
- from letta.services.job_manager import JobManager
15
+ from letta.services.run_manager import RunManager
14
16
  from letta.utils import safe_create_task
15
17
 
16
18
  logger = get_logger(__name__)
@@ -194,7 +196,7 @@ async def create_background_stream_processor(
194
196
  redis_client: AsyncRedisClient,
195
197
  run_id: str,
196
198
  writer: Optional[RedisSSEStreamWriter] = None,
197
- job_manager: Optional[JobManager] = None,
199
+ run_manager: Optional[RunManager] = None,
198
200
  actor: Optional[User] = None,
199
201
  ) -> None:
200
202
  """
@@ -208,8 +210,8 @@ async def create_background_stream_processor(
208
210
  redis_client: Redis client instance
209
211
  run_id: The run ID to store chunks under
210
212
  writer: Optional pre-configured writer (creates new if not provided)
211
- job_manager: Optional job manager for updating job status
212
- actor: Optional actor for job status updates
213
+ run_manager: Optional run manager for updating run status
214
+ actor: Optional actor for run status updates
213
215
  """
214
216
  if writer is None:
215
217
  writer = RedisSSEStreamWriter(redis_client)
@@ -235,9 +237,12 @@ async def create_background_stream_processor(
235
237
  # Write error chunk
236
238
  # error_chunk = {"error": {"message": str(e)}}
237
239
  # Mark run_id terminal state
238
- if job_manager and actor:
239
- await job_manager.safe_update_job_status_async(
240
- job_id=run_id, new_status=JobStatus.failed, actor=actor, metadata={"error": str(e)}
240
+ if run_manager and actor:
241
+ await run_manager.update_run_by_id_async(
242
+ run_id=run_id,
243
+ update=RunUpdate(status=RunStatus.failed, stop_reason=StopReasonType.error.value),
244
+ actor=actor,
245
+ metadata={"error": str(e)},
241
246
  )
242
247
 
243
248
  error_chunk = {"error": str(e), "code": "INTERNAL_SERVER_ERROR"}
@@ -245,6 +250,12 @@ async def create_background_stream_processor(
245
250
  finally:
246
251
  if should_stop_writer:
247
252
  await writer.stop()
253
+ if run_manager and actor:
254
+ await run_manager.update_run_by_id_async(
255
+ run_id=run_id,
256
+ update=RunUpdate(status=RunStatus.completed, stop_reason=StopReasonType.end_turn.value),
257
+ actor=actor,
258
+ )
248
259
 
249
260
 
250
261
  async def redis_sse_stream_generator(