letta-nightly 0.6.32.dev20250225104119__py3-none-any.whl → 0.6.33.dev20250226104113__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.

Potentially problematic release.


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

Files changed (36) hide show
  1. letta/__init__.py +1 -1
  2. letta/agent.py +10 -5
  3. letta/constants.py +7 -0
  4. letta/functions/ast_parsers.py +13 -0
  5. letta/functions/schema_generator.py +14 -2
  6. letta/helpers/composio_helpers.py +3 -2
  7. letta/helpers/tool_execution_helper.py +171 -0
  8. letta/llm_api/anthropic.py +37 -1
  9. letta/orm/source.py +2 -2
  10. letta/schemas/openai/chat_completion_request.py +1 -1
  11. letta/schemas/providers.py +43 -4
  12. letta/schemas/tool.py +1 -13
  13. letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +225 -35
  14. letta/server/rest_api/routers/v1/agents.py +57 -55
  15. letta/server/rest_api/routers/v1/blocks.py +12 -12
  16. letta/server/rest_api/routers/v1/identities.py +12 -12
  17. letta/server/rest_api/routers/v1/jobs.py +8 -8
  18. letta/server/rest_api/routers/v1/providers.py +11 -5
  19. letta/server/rest_api/routers/v1/runs.py +12 -12
  20. letta/server/rest_api/routers/v1/sandbox_configs.py +24 -24
  21. letta/server/rest_api/routers/v1/sources.py +20 -20
  22. letta/server/rest_api/routers/v1/steps.py +8 -7
  23. letta/server/rest_api/routers/v1/tags.py +2 -2
  24. letta/server/rest_api/routers/v1/tools.py +20 -20
  25. letta/server/rest_api/utils.py +2 -3
  26. letta/services/agent_manager.py +36 -0
  27. letta/services/block_manager.py +4 -2
  28. letta/services/identity_manager.py +6 -0
  29. letta/services/message_manager.py +4 -1
  30. letta/services/provider_manager.py +10 -9
  31. letta/services/step_manager.py +2 -2
  32. {letta_nightly-0.6.32.dev20250225104119.dist-info → letta_nightly-0.6.33.dev20250226104113.dist-info}/METADATA +1 -1
  33. {letta_nightly-0.6.32.dev20250225104119.dist-info → letta_nightly-0.6.33.dev20250226104113.dist-info}/RECORD +36 -35
  34. {letta_nightly-0.6.32.dev20250225104119.dist-info → letta_nightly-0.6.33.dev20250226104113.dist-info}/LICENSE +0 -0
  35. {letta_nightly-0.6.32.dev20250225104119.dist-info → letta_nightly-0.6.33.dev20250226104113.dist-info}/WHEEL +0 -0
  36. {letta_nightly-0.6.32.dev20250225104119.dist-info → letta_nightly-0.6.33.dev20250226104113.dist-info}/entry_points.txt +0 -0
@@ -29,12 +29,12 @@ logger = get_logger(__name__)
29
29
  def delete_tool(
30
30
  tool_id: str,
31
31
  server: SyncServer = Depends(get_letta_server),
32
- user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
32
+ actor_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
33
33
  ):
34
34
  """
35
35
  Delete a tool by name
36
36
  """
37
- actor = server.user_manager.get_user_or_default(user_id=user_id)
37
+ actor = server.user_manager.get_user_or_default(user_id=actor_id)
38
38
  server.tool_manager.delete_tool_by_id(tool_id=tool_id, actor=actor)
39
39
 
40
40
 
@@ -42,12 +42,12 @@ def delete_tool(
42
42
  def retrieve_tool(
43
43
  tool_id: str,
44
44
  server: SyncServer = Depends(get_letta_server),
45
- user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
45
+ actor_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
46
46
  ):
47
47
  """
48
48
  Get a tool by ID
49
49
  """
50
- actor = server.user_manager.get_user_or_default(user_id=user_id)
50
+ actor = server.user_manager.get_user_or_default(user_id=actor_id)
51
51
  tool = server.tool_manager.get_tool_by_id(tool_id=tool_id, actor=actor)
52
52
  if tool is None:
53
53
  # return 404 error
@@ -61,13 +61,13 @@ def list_tools(
61
61
  limit: Optional[int] = 50,
62
62
  name: Optional[str] = None,
63
63
  server: SyncServer = Depends(get_letta_server),
64
- user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
64
+ actor_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
65
65
  ):
66
66
  """
67
67
  Get a list of all tools available to agents belonging to the org of the user
68
68
  """
69
69
  try:
70
- actor = server.user_manager.get_user_or_default(user_id=user_id)
70
+ actor = server.user_manager.get_user_or_default(user_id=actor_id)
71
71
  if name is not None:
72
72
  tool = server.tool_manager.get_tool_by_name(tool_name=name, actor=actor)
73
73
  return [tool] if tool else []
@@ -82,13 +82,13 @@ def list_tools(
82
82
  def create_tool(
83
83
  request: ToolCreate = Body(...),
84
84
  server: SyncServer = Depends(get_letta_server),
85
- user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
85
+ actor_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
86
86
  ):
87
87
  """
88
88
  Create a new tool
89
89
  """
90
90
  try:
91
- actor = server.user_manager.get_user_or_default(user_id=user_id)
91
+ actor = server.user_manager.get_user_or_default(user_id=actor_id)
92
92
  tool = Tool(**request.model_dump())
93
93
  return server.tool_manager.create_tool(pydantic_tool=tool, actor=actor)
94
94
  except UniqueConstraintViolationError as e:
@@ -114,13 +114,13 @@ def create_tool(
114
114
  def upsert_tool(
115
115
  request: ToolCreate = Body(...),
116
116
  server: SyncServer = Depends(get_letta_server),
117
- user_id: Optional[str] = Header(None, alias="user_id"),
117
+ actor_id: Optional[str] = Header(None, alias="user_id"),
118
118
  ):
119
119
  """
120
120
  Create or update a tool
121
121
  """
122
122
  try:
123
- actor = server.user_manager.get_user_or_default(user_id=user_id)
123
+ actor = server.user_manager.get_user_or_default(user_id=actor_id)
124
124
  tool = server.tool_manager.create_or_update_tool(pydantic_tool=Tool(**request.model_dump()), actor=actor)
125
125
  return tool
126
126
  except UniqueConstraintViolationError as e:
@@ -142,13 +142,13 @@ def modify_tool(
142
142
  tool_id: str,
143
143
  request: ToolUpdate = Body(...),
144
144
  server: SyncServer = Depends(get_letta_server),
145
- user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
145
+ actor_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
146
146
  ):
147
147
  """
148
148
  Update an existing tool
149
149
  """
150
150
  try:
151
- actor = server.user_manager.get_user_or_default(user_id=user_id)
151
+ actor = server.user_manager.get_user_or_default(user_id=actor_id)
152
152
  return server.tool_manager.update_tool_by_id(tool_id=tool_id, tool_update=request, actor=actor)
153
153
  except LettaToolCreateError as e:
154
154
  # HTTP 400 == Bad Request
@@ -163,12 +163,12 @@ def modify_tool(
163
163
  @router.post("/add-base-tools", response_model=List[Tool], operation_id="add_base_tools")
164
164
  def upsert_base_tools(
165
165
  server: SyncServer = Depends(get_letta_server),
166
- user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
166
+ actor_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
167
167
  ):
168
168
  """
169
169
  Upsert base tools
170
170
  """
171
- actor = server.user_manager.get_user_or_default(user_id=user_id)
171
+ actor = server.user_manager.get_user_or_default(user_id=actor_id)
172
172
  return server.tool_manager.upsert_base_tools(actor=actor)
173
173
 
174
174
 
@@ -176,12 +176,12 @@ def upsert_base_tools(
176
176
  def run_tool_from_source(
177
177
  server: SyncServer = Depends(get_letta_server),
178
178
  request: ToolRunFromSource = Body(...),
179
- user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
179
+ actor_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
180
180
  ):
181
181
  """
182
182
  Attempt to build a tool from source, then run it on the provided arguments
183
183
  """
184
- actor = server.user_manager.get_user_or_default(user_id=user_id)
184
+ actor = server.user_manager.get_user_or_default(user_id=actor_id)
185
185
 
186
186
  try:
187
187
  return server.run_tool_from_source(
@@ -227,12 +227,12 @@ def list_composio_apps(server: SyncServer = Depends(get_letta_server), user_id:
227
227
  def list_composio_actions_by_app(
228
228
  composio_app_name: str,
229
229
  server: SyncServer = Depends(get_letta_server),
230
- user_id: Optional[str] = Header(None, alias="user_id"),
230
+ actor_id: Optional[str] = Header(None, alias="user_id"),
231
231
  ):
232
232
  """
233
233
  Get a list of all Composio actions for a specific app
234
234
  """
235
- actor = server.user_manager.get_user_or_default(user_id=user_id)
235
+ actor = server.user_manager.get_user_or_default(user_id=actor_id)
236
236
  composio_api_key = get_composio_api_key(actor=actor, logger=logger)
237
237
  if not composio_api_key:
238
238
  raise HTTPException(
@@ -246,12 +246,12 @@ def list_composio_actions_by_app(
246
246
  def add_composio_tool(
247
247
  composio_action_name: str,
248
248
  server: SyncServer = Depends(get_letta_server),
249
- user_id: Optional[str] = Header(None, alias="user_id"),
249
+ actor_id: Optional[str] = Header(None, alias="user_id"),
250
250
  ):
251
251
  """
252
252
  Add a new Composio tool by action name (Composio refers to each tool as an `Action`)
253
253
  """
254
- actor = server.user_manager.get_user_or_default(user_id=user_id)
254
+ actor = server.user_manager.get_user_or_default(user_id=actor_id)
255
255
 
256
256
  try:
257
257
  tool_create = ToolCreate.from_composio(action_name=composio_action_name)
@@ -7,7 +7,6 @@ from datetime import datetime, timezone
7
7
  from enum import Enum
8
8
  from typing import TYPE_CHECKING, AsyncGenerator, Dict, Iterable, List, Optional, Union, cast
9
9
 
10
- import pytz
11
10
  from fastapi import Header, HTTPException
12
11
  from openai.types.chat import ChatCompletionMessageParam
13
12
  from openai.types.chat.chat_completion_message_tool_call import ChatCompletionMessageToolCall as OpenAIToolCall
@@ -145,7 +144,7 @@ def create_user_message(input_message: dict, agent_id: str, actor: User) -> Mess
145
144
  Converts a user input message into the internal structured format.
146
145
  """
147
146
  # Generate timestamp in the correct format
148
- now = datetime.now(pytz.timezone("US/Pacific")).strftime("%Y-%m-%d %I:%M:%S %p %Z%z")
147
+ now = datetime.now(timezone.utc).isoformat()
149
148
 
150
149
  # Format message as structured JSON
151
150
  structured_message = {"type": "user_message", "message": input_message["content"], "time": now}
@@ -197,7 +196,7 @@ def create_assistant_message_from_openai_response(
197
196
  agent_id=agent_id,
198
197
  model=model,
199
198
  tool_calls=[tool_call],
200
- tool_call_id=None,
199
+ tool_call_id=tool_call_id,
201
200
  created_at=datetime.now(timezone.utc),
202
201
  )
203
202
 
@@ -21,8 +21,10 @@ from letta.orm.sqlite_functions import adapt_array
21
21
  from letta.schemas.agent import AgentState as PydanticAgentState
22
22
  from letta.schemas.agent import AgentType, CreateAgent, UpdateAgent
23
23
  from letta.schemas.block import Block as PydanticBlock
24
+ from letta.schemas.block import BlockUpdate
24
25
  from letta.schemas.embedding_config import EmbeddingConfig
25
26
  from letta.schemas.llm_config import LLMConfig
27
+ from letta.schemas.memory import Memory
26
28
  from letta.schemas.message import Message as PydanticMessage
27
29
  from letta.schemas.message import MessageCreate
28
30
  from letta.schemas.passage import Passage as PydanticPassage
@@ -613,6 +615,40 @@ class AgentManager:
613
615
  )
614
616
  return self.append_to_in_context_messages([system_message], agent_id=agent_state.id, actor=actor)
615
617
 
618
+ # TODO: I moved this from agent.py - replace all mentions of this with the agent_manager version
619
+ @enforce_types
620
+ def update_memory_if_changed(self, agent_id: str, new_memory: Memory, actor: PydanticUser) -> PydanticAgentState:
621
+ """
622
+ Update internal memory object and system prompt if there have been modifications.
623
+
624
+ Args:
625
+ new_memory (Memory): the new memory object to compare to the current memory object
626
+
627
+ Returns:
628
+ modified (bool): whether the memory was updated
629
+ """
630
+ agent_state = self.get_agent_by_id(agent_id=agent_id, actor=actor)
631
+ if agent_state.memory.compile() != new_memory.compile():
632
+ # update the blocks (LRW) in the DB
633
+ for label in agent_state.memory.list_block_labels():
634
+ updated_value = new_memory.get_block(label).value
635
+ if updated_value != agent_state.memory.get_block(label).value:
636
+ # update the block if it's changed
637
+ block_id = agent_state.memory.get_block(label).id
638
+ block = self.block_manager.update_block(block_id=block_id, block_update=BlockUpdate(value=updated_value), actor=actor)
639
+
640
+ # refresh memory from DB (using block ids)
641
+ agent_state.memory = Memory(
642
+ blocks=[self.block_manager.get_block_by_id(block.id, actor=actor) for block in agent_state.memory.get_blocks()]
643
+ )
644
+
645
+ # NOTE: don't do this since re-buildin the memory is handled at the start of the step
646
+ # rebuild memory - this records the last edited timestamp of the memory
647
+ # TODO: pass in update timestamp from block edit time
648
+ agent_state = self.rebuild_system_prompt(agent_id=agent_id, actor=actor)
649
+
650
+ return agent_state
651
+
616
652
  # ======================================================================================================================
617
653
  # Source Management
618
654
  # ======================================================================================================================
@@ -107,12 +107,14 @@ class BlockManager:
107
107
  @enforce_types
108
108
  def add_default_blocks(self, actor: PydanticUser):
109
109
  for persona_file in list_persona_files():
110
- text = open(persona_file, "r", encoding="utf-8").read()
110
+ with open(persona_file, "r", encoding="utf-8") as f:
111
+ text = f.read()
111
112
  name = os.path.basename(persona_file).replace(".txt", "")
112
113
  self.create_or_update_block(Persona(template_name=name, value=text, is_template=True), actor=actor)
113
114
 
114
115
  for human_file in list_human_files():
115
- text = open(human_file, "r", encoding="utf-8").read()
116
+ with open(human_file, "r", encoding="utf-8") as f:
117
+ text = f.read()
116
118
  name = os.path.basename(human_file).replace(".txt", "")
117
119
  self.create_or_update_block(Human(template_name=name, value=text, is_template=True), actor=actor)
118
120
 
@@ -111,6 +111,12 @@ class IdentityManager:
111
111
  existing_identity.name = identity.name
112
112
  if identity.identity_type is not None:
113
113
  existing_identity.identity_type = identity.identity_type
114
+ if identity.properties is not None:
115
+ if replace:
116
+ existing_identity.properties = [prop.model_dump() for prop in identity.properties]
117
+ else:
118
+ new_properties = existing_identity.properties + identity.properties
119
+ existing_identity.properties = [prop.model_dump() for prop in new_properties]
114
120
 
115
121
  self._process_agent_relationship(
116
122
  session=session, identity=existing_identity, agent_ids=identity.agent_ids, allow_partial=False, replace=replace
@@ -2,6 +2,7 @@ from typing import List, Optional
2
2
 
3
3
  from sqlalchemy import and_, or_
4
4
 
5
+ from letta.log import get_logger
5
6
  from letta.orm.agent import Agent as AgentModel
6
7
  from letta.orm.errors import NoResultFound
7
8
  from letta.orm.message import Message as MessageModel
@@ -11,6 +12,8 @@ from letta.schemas.message import MessageUpdate
11
12
  from letta.schemas.user import User as PydanticUser
12
13
  from letta.utils import enforce_types
13
14
 
15
+ logger = get_logger(__name__)
16
+
14
17
 
15
18
  class MessageManager:
16
19
  """Manager class to handle business logic related to Messages."""
@@ -37,7 +40,7 @@ class MessageManager:
37
40
  results = MessageModel.list(db_session=session, id=message_ids, organization_id=actor.organization_id, limit=len(message_ids))
38
41
 
39
42
  if len(results) != len(message_ids):
40
- raise NoResultFound(
43
+ logger.warning(
41
44
  f"Expected {len(message_ids)} messages, but found {len(results)}. Missing ids={set(message_ids) - set([r.id for r in results])}"
42
45
  )
43
46
 
@@ -25,15 +25,15 @@ class ProviderManager:
25
25
  provider.resolve_identifier()
26
26
 
27
27
  new_provider = ProviderModel(**provider.model_dump(to_orm=True, exclude_unset=True))
28
- new_provider.create(session)
28
+ new_provider.create(session, actor=actor)
29
29
  return new_provider.to_pydantic()
30
30
 
31
31
  @enforce_types
32
- def update_provider(self, provider_update: ProviderUpdate) -> PydanticProvider:
32
+ def update_provider(self, provider_update: ProviderUpdate, actor: PydanticUser) -> PydanticProvider:
33
33
  """Update provider details."""
34
34
  with self.session_maker() as session:
35
35
  # Retrieve the existing provider by ID
36
- existing_provider = ProviderModel.read(db_session=session, identifier=provider_update.id)
36
+ existing_provider = ProviderModel.read(db_session=session, identifier=provider_update.id, actor=actor)
37
37
 
38
38
  # Update only the fields that are provided in ProviderUpdate
39
39
  update_data = provider_update.model_dump(to_orm=True, exclude_unset=True, exclude_none=True)
@@ -41,31 +41,32 @@ class ProviderManager:
41
41
  setattr(existing_provider, key, value)
42
42
 
43
43
  # Commit the updated provider
44
- existing_provider.update(session)
44
+ existing_provider.update(session, actor=actor)
45
45
  return existing_provider.to_pydantic()
46
46
 
47
47
  @enforce_types
48
- def delete_provider_by_id(self, provider_id: str):
48
+ def delete_provider_by_id(self, provider_id: str, actor: PydanticUser):
49
49
  """Delete a provider."""
50
50
  with self.session_maker() as session:
51
51
  # Clear api key field
52
- existing_provider = ProviderModel.read(db_session=session, identifier=provider_id)
52
+ existing_provider = ProviderModel.read(db_session=session, identifier=provider_id, actor=actor)
53
53
  existing_provider.api_key = None
54
- existing_provider.update(session)
54
+ existing_provider.update(session, actor=actor)
55
55
 
56
56
  # Soft delete in provider table
57
- existing_provider.delete(session)
57
+ existing_provider.delete(session, actor=actor)
58
58
 
59
59
  session.commit()
60
60
 
61
61
  @enforce_types
62
- def list_providers(self, after: Optional[str] = None, limit: Optional[int] = 50) -> List[PydanticProvider]:
62
+ def list_providers(self, after: Optional[str] = None, limit: Optional[int] = 50, actor: PydanticUser = None) -> List[PydanticProvider]:
63
63
  """List all providers with optional pagination."""
64
64
  with self.session_maker() as session:
65
65
  providers = ProviderModel.list(
66
66
  db_session=session,
67
67
  after=after,
68
68
  limit=limit,
69
+ actor=actor,
69
70
  )
70
71
  return [provider.to_pydantic() for provider in providers]
71
72
 
@@ -84,9 +84,9 @@ class StepManager:
84
84
  return new_step.to_pydantic()
85
85
 
86
86
  @enforce_types
87
- def get_step(self, step_id: str) -> PydanticStep:
87
+ def get_step(self, step_id: str, actor: PydanticUser) -> PydanticStep:
88
88
  with self.session_maker() as session:
89
- step = StepModel.read(db_session=session, identifier=step_id)
89
+ step = StepModel.read(db_session=session, identifier=step_id, actor=actor)
90
90
  return step.to_pydantic()
91
91
 
92
92
  @enforce_types
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: letta-nightly
3
- Version: 0.6.32.dev20250225104119
3
+ Version: 0.6.33.dev20250226104113
4
4
  Summary: Create LLM agents with long-term memory and custom tools
5
5
  License: Apache License
6
6
  Author: Letta Team
@@ -1,6 +1,6 @@
1
- letta/__init__.py,sha256=tmmp6uQ3-OT9i8zJc28Y1KBRjJ0FwlKwu_O3MS8sKj8,918
1
+ letta/__init__.py,sha256=ZG24l5R0k4y_ttVVqlMdf3VtTG63oUJlIbU0I38-TrM,918
2
2
  letta/__main__.py,sha256=6Hs2PV7EYc5Tid4g4OtcLXhqVHiNYTGzSBdoOnW2HXA,29
3
- letta/agent.py,sha256=cHbzAFuqSGS3-H0qODtjyQXvuBZwgAwvDv1TYGHtRX4,60694
3
+ letta/agent.py,sha256=NqmrtW0gNfo0kT15WzRfY-TzhMDx4TaWfEmPUWSB2FI,60921
4
4
  letta/benchmark/benchmark.py,sha256=ebvnwfp3yezaXOQyGXkYCDYpsmre-b9hvNtnyx4xkG0,3701
5
5
  letta/benchmark/constants.py,sha256=aXc5gdpMGJT327VuxsT5FngbCK2J41PQYeICBO7g_RE,536
6
6
  letta/chat_only_agent.py,sha256=71Lf-df8y3nsE9IFKpEigaZaWHoWnXnhVChkp1L-83I,4760
@@ -12,32 +12,33 @@ letta/client/client.py,sha256=7RQjZ-3yn_Hc9QsZoNCFRilyvfTq-Xie2sNbs1Lmbh4,138697
12
12
  letta/client/streaming.py,sha256=lN9vamc07sfQlRbFif327GvURLUPhx-4AC_oUOPvs6w,4543
13
13
  letta/client/utils.py,sha256=VCGV-op5ZSmurd4yw7Vhf93XDQ0BkyBT8qsuV7EqfiU,2859
14
14
  letta/config.py,sha256=JFGY4TWW0Wm5fTbZamOwWqk5G8Nn-TXyhgByGoAqy2c,12375
15
- letta/constants.py,sha256=p_PviHcjrCtSwoLc8uPtMYKBl-i9xn4p4gw4hZMO5OA,7254
15
+ letta/constants.py,sha256=9ZT-kJAZWgB4rqPlYX6Ec_WTk13j-QrNnRu4TFiuq7Y,7453
16
16
  letta/data_sources/connectors.py,sha256=R2AssXpqS7wN6VI8AfxvqaZs5S1ZACc4E_FewmR9iZI,7022
17
17
  letta/data_sources/connectors_helper.py,sha256=2TQjCt74fCgT5sw1AP8PalDEk06jPBbhrPG4HVr-WLs,3371
18
18
  letta/embeddings.py,sha256=zqlfbN3aCgSOlNd9M2NW9zrwx4WwQzketb8oa5BzzE8,10831
19
19
  letta/errors.py,sha256=6fQXg2unP-2fo3R7db0ayKKWlD2XMusOPNi9TgJplCg,5558
20
20
  letta/functions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
- letta/functions/ast_parsers.py,sha256=MEFfGxpflUsw34JiY9zdunkpbczAYxte8t4rDPOmXfQ,3620
21
+ letta/functions/ast_parsers.py,sha256=3ejgFDLbGxGMnYRe1d9YCqoo-ehSrmdDQTsxGM-shTM,4161
22
22
  letta/functions/function_sets/base.py,sha256=M3_1Pge2GiyITp_U73T_Sd9O2rFoNlbuT8KgzMjexfs,5999
23
23
  letta/functions/function_sets/extras.py,sha256=R1a97EKepEPDxJKsxQPFdXXWQrkVppOvKbEkRc_79tc,4852
24
24
  letta/functions/function_sets/multi_agent.py,sha256=BcMeod0-lMhnKeaVWJp2T1PzRV0qvCuTWAPMJxAbgHI,4073
25
25
  letta/functions/functions.py,sha256=NyWLh7a-f4mXti5vM1oWDwXzfA58VmVVqL03O9vosKY,5672
26
26
  letta/functions/helpers.py,sha256=TBji0j7hWT6DvjYY5gfN0CzxCRsVGh8uA6ACp9V3v3M,23185
27
27
  letta/functions/interface.py,sha256=s_PPp5WDvGH_y9KUpMlORkdC141ITczFk3wsevrrUD8,2866
28
- letta/functions/schema_generator.py,sha256=C_UYD9ahgR9C0Lk_CqPULDk_5VaS1RBklIAKTXrNtY8,20120
28
+ letta/functions/schema_generator.py,sha256=s10835BHVuGZPGgByjNhDTO9-zv5eOYMPajQh3hFo1c,20678
29
29
  letta/helpers/__init__.py,sha256=p0luQ1Oe3Skc6sH4O58aHHA3Qbkyjifpuq0DZ1GAY0U,59
30
- letta/helpers/composio_helpers.py,sha256=ku6jRVCO8gVixeaCORVn0RZWUza9rob-18Q-g4t41fE,909
30
+ letta/helpers/composio_helpers.py,sha256=6CWV483vE3N-keQlblexxBiQHxorMAgQuvbok4adGO4,949
31
31
  letta/helpers/converters.py,sha256=TL3g69RsSByx0IzO434nO3c8zwfPKEIj0R5QAiBsyKM,5415
32
32
  letta/helpers/datetime_helpers.py,sha256=7U5ZJkE0cLki4sG8ukIHZSAoFfQpLWQu2kFekETy6Zg,2633
33
33
  letta/helpers/json_helpers.py,sha256=PWZ5HhSqGXO4e563dM_8M72q7ScirjXQ4Rv1ckohaV8,396
34
+ letta/helpers/tool_execution_helper.py,sha256=bskCscuz2nqoUboFcYA7sQGeikdEyqiYnNpO4gLQTdc,7469
34
35
  letta/helpers/tool_rule_solver.py,sha256=z-2Zq_qWykgWanFZYxtxUee4FkMnxqvntXe2tomoH68,6774
35
36
  letta/humans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
37
  letta/humans/examples/basic.txt,sha256=Lcp8YESTWvOJgO4Yf_yyQmgo5bKakeB1nIVrwEGG6PA,17
37
38
  letta/humans/examples/cs_phd.txt,sha256=9C9ZAV_VuG7GB31ksy3-_NAyk8rjE6YtVOkhp08k1xw,297
38
39
  letta/interface.py,sha256=6CrnvydRZfVY9BQ4fCn85rmQU6D9udcsGww8nTnT95E,12793
39
40
  letta/llm_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
- letta/llm_api/anthropic.py,sha256=4wvjrqJ1SziZ8pzKeiSLhkUcfwg2scz3efM8jGyPMzc,36457
41
+ letta/llm_api/anthropic.py,sha256=hsRuS0-bj74ID4_axQiMwjb8ZmpInStumaHTqvMP_M4,37426
41
42
  letta/llm_api/aws_bedrock.py,sha256=J_oCM810-m2T-tgo3iRwSM0BuykBN5AK3SbkyiOaGbc,3835
42
43
  letta/llm_api/azure_openai.py,sha256=Y1HKPog1XzM_f7ujUK_Gv2zQkoy5pU-1bKiUnvSxSrs,6297
43
44
  letta/llm_api/azure_openai_constants.py,sha256=ZaR2IasJThijG0uhLKJThrixdAxLPD2IojfeaJ-KQMQ,294
@@ -114,7 +115,7 @@ letta/orm/organization.py,sha256=ciF2ffCBMddfOQ9O1gHv_cFMTPUlSQZNDYYXFgH_z1E,307
114
115
  letta/orm/passage.py,sha256=tQi-fZZFBFVz0KZxd0foKPkAOaempgiYOHHK6lJ98gw,3332
115
116
  letta/orm/provider.py,sha256=-qA9tvKTZgaM4D7CoDZZiA7zTgjaaWDV4jZvifQv_MM,805
116
117
  letta/orm/sandbox_config.py,sha256=DyOy_1_zCMlp13elCqPcuuA6OwUove6mrjhcpROTg50,4150
117
- letta/orm/source.py,sha256=cpaleNiP-DomM2oopwgL2DGn38ITQwLMs5mKODf_c_4,2167
118
+ letta/orm/source.py,sha256=z89VZUHV9K8Ew9JCYoZqUeRb1WEUKmrn0MMFkppaphE,2117
118
119
  letta/orm/sources_agents.py,sha256=Ik_PokCBrXRd9wXWomeNeb8EtLUwjb9VMZ8LWXqpK5A,473
119
120
  letta/orm/sqlalchemy_base.py,sha256=tIuKJ0CH4tYCzhpDqqr2EDD6AxGlnXI752oYZtlvM6o,22151
120
121
  letta/orm/sqlite_functions.py,sha256=JCScKiRlYCKxy9hChQ8wsk4GMKknZE24MunnG3fM1Gw,4255
@@ -167,19 +168,19 @@ letta/schemas/llm_config.py,sha256=R0GQvw3DzsShpxZY6eWte4A2f1QjUrAAJ928DvLuBZs,5
167
168
  letta/schemas/llm_config_overrides.py,sha256=-oRglCTcajF6UAK3RAa0FLWVuKODPI1v403fDIWMAtA,1815
168
169
  letta/schemas/memory.py,sha256=GOYDfPKzbWftUWO9Hv4KW7xAi1EIQmC8zpP7qvEkVHw,10245
169
170
  letta/schemas/message.py,sha256=3-0zd-WuasJ1rZPDSqwJ7mRex399icPgpsVk19T7CoQ,37687
170
- letta/schemas/openai/chat_completion_request.py,sha256=AOIwgbN3CZKVqkuXeMHeSa53u4h0wVq69t3T_LJ0vIE,3389
171
+ letta/schemas/openai/chat_completion_request.py,sha256=3tALmbBV2pv1CcqzNLBxxIPOQ8Z85woucT7FN0fuDic,3402
171
172
  letta/schemas/openai/chat_completion_response.py,sha256=koEb_NTiz5YsAAX81Z0cSqSFX4a6MdD2lhoXtxF_rw4,4100
172
173
  letta/schemas/openai/chat_completions.py,sha256=l0e9sT9boTD5VBU5YtJ0s7qUtCfFGB2K-gQLeEZ2LHU,3599
173
174
  letta/schemas/openai/embedding_response.py,sha256=WKIZpXab1Av7v6sxKG8feW3ZtpQUNosmLVSuhXYa_xU,357
174
175
  letta/schemas/openai/openai.py,sha256=Hilo5BiLAGabzxCwnwfzK5QrWqwYD8epaEKFa4Pwndk,7970
175
176
  letta/schemas/organization.py,sha256=_RR8jlOOdJyG31q53IDdIvBVvIfAZrQWAGuvc5HmW24,788
176
177
  letta/schemas/passage.py,sha256=RG0vkaewEu4a_NAZM-FVyMammHjqpPP0RDYAdu27g6A,3723
177
- letta/schemas/providers.py,sha256=FDa5DMzzFGmBGaRMz0CZhre06lBzXp2wUKB8r528Za4,39957
178
+ letta/schemas/providers.py,sha256=JUFdujrLmrGA84tybQ4aquxknEyiod47lRKrpStm9s4,41351
178
179
  letta/schemas/run.py,sha256=SRqPRziINIiPunjOhE_NlbnQYgxTvqmbauni_yfBQRA,2085
179
180
  letta/schemas/sandbox_config.py,sha256=Nz8K5brqe6jpf66KnTJ0-E7ZeFdPoBFGN-XOI35OeaY,5926
180
181
  letta/schemas/source.py,sha256=-BQVolcXA2ziCu2ztR6cbTdGUc8G7vGJy7rvpdf1hpg,2880
181
182
  letta/schemas/step.py,sha256=wQ-AzhMjH7tLFgZbJfcPkW9a9V81JYWzJCQtTfcb11E,2034
182
- letta/schemas/tool.py,sha256=dDyzvLZ_gw9DdcFplGTHoH9aFQnF2ez-ApYLRtxAfys,11051
183
+ letta/schemas/tool.py,sha256=xRGKnzlCdxTlSBjnsLe0h2CuGJa3d-GN4G-kjmCEDbw,10165
183
184
  letta/schemas/tool_rule.py,sha256=2YQZba4fXS3u4j8pIk7BDujfq8rnxSVMwJSyaVgApH4,2149
184
185
  letta/schemas/usage.py,sha256=8oYRH-JX0PfjIu2zkT5Uu3UWQ7Unnz_uHiO8hRGI4m0,912
185
186
  letta/schemas/user.py,sha256=V32Tgl6oqB3KznkxUz12y7agkQicjzW7VocSpj78i6Q,1526
@@ -202,25 +203,25 @@ letta/server/rest_api/interface.py,sha256=jAt7azrk27sNKNCZHgoIzYDIUbEgJ8hsC3Ef7O
202
203
  letta/server/rest_api/optimistic_json_parser.py,sha256=1z4d9unmxMb0ou7owJ62uUQoNjNYf21FmaNdg0ZcqUU,6567
203
204
  letta/server/rest_api/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
204
205
  letta/server/rest_api/routers/openai/chat_completions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
205
- letta/server/rest_api/routers/openai/chat_completions/chat_completions.py,sha256=xEi3nPOkrGiv3lQJbLsVtEJuFQYR1mZFvHqExJO6MDY,8982
206
+ letta/server/rest_api/routers/openai/chat_completions/chat_completions.py,sha256=8u7n42niB_6X5uShMa76-ldAMdx7lHG-6ax8GEAr25s,17478
206
207
  letta/server/rest_api/routers/v1/__init__.py,sha256=kQUDemPYl4ZcOndpsexbLQRAObkuDN00ZYTnQJYiHNk,1269
207
- letta/server/rest_api/routers/v1/agents.py,sha256=OrP-F58ca8D2uZcsj2dqHrkrcMcsdszxTUP48HOGXkc,26081
208
- letta/server/rest_api/routers/v1/blocks.py,sha256=oJYOpGUTd4AhKwVolVlZPIXO2EoOrBHkyi2PdrmbtmA,3888
208
+ letta/server/rest_api/routers/v1/agents.py,sha256=Ac7IpwwxutLKziJIzTKTrh90cd3u0aC6Nixbxbo7bE0,26274
209
+ letta/server/rest_api/routers/v1/blocks.py,sha256=0j7JX2BQzk31RyhvPZeEb-zh9ImXsVU4_8y5XMiR_WA,3900
209
210
  letta/server/rest_api/routers/v1/health.py,sha256=MoOjkydhGcJXTiuJrKIB0etVXiRMdTa51S8RQ8-50DQ,399
210
- letta/server/rest_api/routers/v1/identities.py,sha256=CA9hhUcqcGX-5n4GTIK14ydfxEHiiTbvUS--JbkTqd8,4969
211
- letta/server/rest_api/routers/v1/jobs.py,sha256=pKihW12hQdFwt6tHQXs94yOMv6xotlhBB3Vl7Q5ASKQ,2738
211
+ letta/server/rest_api/routers/v1/identities.py,sha256=CCEF-e91yXOaHevEM0cpPoTHGnWNVljvKD5YC1nFvVk,4981
212
+ letta/server/rest_api/routers/v1/jobs.py,sha256=4oeJfI2odNGubU_g7WSORJhn_usFsbRaD-qm86rve1E,2746
212
213
  letta/server/rest_api/routers/v1/llms.py,sha256=lYp5URXtZk1yu_Pe-p1Wq1uQ0qeb6aWtx78rXSB7N_E,881
213
214
  letta/server/rest_api/routers/v1/organizations.py,sha256=8n-kA9LHtKImdY2xL-v7m6nYAbFWqH1vjBCJhQbv7Is,2077
214
- letta/server/rest_api/routers/v1/providers.py,sha256=EOwSy4KsU63RY_NjzjjR4K6uaAmewXYTgbNOL4aO-X8,2444
215
- letta/server/rest_api/routers/v1/runs.py,sha256=4w06j5CYfRzVf5Jf9Fzh7zQyVxC1R6q9gpglERYKeHU,6062
216
- letta/server/rest_api/routers/v1/sandbox_configs.py,sha256=_6WcwgKrgRfnTEC_EgoN-gt8yTkLPgMdM56g1SwX_eo,8502
217
- letta/server/rest_api/routers/v1/sources.py,sha256=g7NKgbZkS7y1vlukJHZ_yoWrk3AxyoWKTVGszp0Ky18,8414
218
- letta/server/rest_api/routers/v1/steps.py,sha256=SuZmneaeSSAHjOMatMt_QILLzkNpkbwuVgKiMYr52cE,3038
219
- letta/server/rest_api/routers/v1/tags.py,sha256=45G0cmcP-ER0OO5OanT_fGtGQfl9ZjRKU97mFwtwyfo,878
220
- letta/server/rest_api/routers/v1/tools.py,sha256=DD01gnqDNd5UKYCw8qZ_SV7ktOzzc73C5vbFUrIk2mk,13127
215
+ letta/server/rest_api/routers/v1/providers.py,sha256=qyZsNTXgLVsoLZoCVY4qaqiG34zCEVmRUP2Cn6maK_4,2949
216
+ letta/server/rest_api/routers/v1/runs.py,sha256=OhyB53q1HiFJCHtRGemfWw5y8cAWwZPxYSzkb1EUC6Y,6074
217
+ letta/server/rest_api/routers/v1/sandbox_configs.py,sha256=9hqnnMwJ3wCwO-Bezu3Xl8i3TDSIuInw3gSeHaKUXfE,8526
218
+ letta/server/rest_api/routers/v1/sources.py,sha256=rpQhaRHyzGUK43LX623L8BBLqL85HJ6fUYPMvI4k3kA,8434
219
+ letta/server/rest_api/routers/v1/steps.py,sha256=IpCQuxpS34-4Qpgdv0FQJO-SffkFkW-OaRjWHquB_1w,3136
220
+ letta/server/rest_api/routers/v1/tags.py,sha256=coydgvL6-9cuG2Hy5Ea7QY3inhTHlsf69w0tcZenBus,880
221
+ letta/server/rest_api/routers/v1/tools.py,sha256=qIpXzrjihQgEnoGeiKxEzaKmzHIVvBO0V_lR1ciBHZs,13147
221
222
  letta/server/rest_api/routers/v1/users.py,sha256=G5DBHSkPfBgVHN2Wkm-rVYiLQAudwQczIq2Z3YLdbVo,2277
222
223
  letta/server/rest_api/static_files.py,sha256=NG8sN4Z5EJ8JVQdj19tkFa9iQ1kBPTab9f_CUxd_u4Q,3143
223
- letta/server/rest_api/utils.py,sha256=lOLqSWPq3yh3AzbAOxCI89Y4laXSDmIhDQ34s4VVhp8,12025
224
+ letta/server/rest_api/utils.py,sha256=fsp5rojySucv3TSSaY9QQ5DUyE6GhxkyKg8rZQQhZVA,11980
224
225
  letta/server/server.py,sha256=3TjO0sef8UeQc_0efCoPT6vGz7f673KDZHwd15qKW2Q,57384
225
226
  letta/server/startup.sh,sha256=qEi6dQHJRzEzDIgnIODj-RYp-O1XstfFpc6cFLkUzVs,1576
226
227
  letta/server/static_files/assets/index-048c9598.js,sha256=mR16XppvselwKCcNgONs4L7kZEVa4OEERm4lNZYtLSk,146819
@@ -235,20 +236,20 @@ letta/server/ws_api/interface.py,sha256=TWl9vkcMCnLsUtgsuENZ-ku2oMDA-OUTzLh_yNRo
235
236
  letta/server/ws_api/protocol.py,sha256=5mDgpfNZn_kNwHnpt5Dsuw8gdNH298sgxTGed3etzYg,1836
236
237
  letta/server/ws_api/server.py,sha256=cBSzf-V4zT1bL_0i54OTI3cMXhTIIxqjSRF8pYjk7fg,5835
237
238
  letta/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
238
- letta/services/agent_manager.py,sha256=rS5WqtFPrPYg_1C1EgB74uABTypuSv-j-mndql2_PM4,53648
239
- letta/services/block_manager.py,sha256=VQvaMAuIdvJcboaGK1NUznvaoPGf13uzeUDhKzN7EhY,5515
239
+ letta/services/agent_manager.py,sha256=fiLhLgYh65LXGuzwsYD38oT3lfBhnyn6yK1uvY3DePg,55536
240
+ letta/services/block_manager.py,sha256=PkbiO59VimLyK6PolWR5O29uHxksCH6pP6K4Vkov3NA,5573
240
241
  letta/services/helpers/agent_manager_helper.py,sha256=MexqAGoc2e8Bso4_hJhBR6qyiFXtiB2MiMMqL-ur1a0,11302
241
242
  letta/services/helpers/tool_execution_helper.py,sha256=q8uSiQcX6VH_iNg5VNloZgC2JkH9lIOXBKCXYPx2Yac,6097
242
- letta/services/identity_manager.py,sha256=oLeeqRdjh-uhZHQ8S6QeSrTpAm7NZKhzjbcXHejha_g,6781
243
+ letta/services/identity_manager.py,sha256=iFkiEqY8Uik8Bzla53Qh1empZvfJug914xzIwWCO9ho,7144
243
244
  letta/services/job_manager.py,sha256=y7P03ijWrOY1HzhphrRdeEPUQz-wHcNvoi-zrefjbuE,13155
244
- letta/services/message_manager.py,sha256=GOjDXSyYXUbXJafFshz-4-wVyg2szV73q-f4cWp0Ogs,10643
245
+ letta/services/message_manager.py,sha256=miGZ24h6NC16wHiTP95ooo-M-o2x1rxRnj67p8vQyOY,10702
245
246
  letta/services/organization_manager.py,sha256=dhQ3cFPXWNYLfMjdahr2HsOAMJ1JtCEWj1G8Nei5MQc,3388
246
247
  letta/services/passage_manager.py,sha256=mwShFO_xRaTi82fvANb_ngO0TmGaZPA9FPu8KuZ6Gd8,8643
247
248
  letta/services/per_agent_lock_manager.py,sha256=porM0cKKANQ1FvcGXOO_qM7ARk5Fgi1HVEAhXsAg9-4,546
248
- letta/services/provider_manager.py,sha256=PFi029lFp2tV4p9IA27xNZ9F0olIF94R-l-dOpyEnWM,3571
249
+ letta/services/provider_manager.py,sha256=QOKMSZOM6eAWa2-nANWQc1frKBh8N3gqDq0V87fnSuc,3748
249
250
  letta/services/sandbox_config_manager.py,sha256=AlZFtESHfEQf3T6WEpn7-B4nZgmnoO_-FxB5FCxSqpY,13357
250
251
  letta/services/source_manager.py,sha256=SE24AiPPhpvZMGDD047H3_ZDD7OM4zHbTW1JXjPEv7U,7672
251
- letta/services/step_manager.py,sha256=lA1n3fYOHcB_5Ov5Ycp3WdAcW5hpPc1pVShI-B5Iwt0,4966
252
+ letta/services/step_manager.py,sha256=svDP_Mv64iIJKzYDFlDT5fabmWBvyjPPa0FIN--L7u0,5000
252
253
  letta/services/tool_execution_sandbox.py,sha256=mev4oCHy4B_uoXRccTirDNp_pSX_s5wbUVNz1oKrvBU,22067
253
254
  letta/services/tool_manager.py,sha256=Q-J8mZKw3zi5Ymxy48DiwpOcv1s6rqdSkRHE6pbnzKk,9568
254
255
  letta/services/user_manager.py,sha256=ScHbdJK9kNF8QXjsd3ZWGEL87n_Uyp3YwfKetOJmpHs,4304
@@ -258,8 +259,8 @@ letta/streaming_utils.py,sha256=jLqFTVhUL76FeOuYk8TaRQHmPTf3HSRc2EoJwxJNK6U,1194
258
259
  letta/system.py,sha256=dnOrS2FlRMwijQnOvfrky0Lg8wEw-FUq2zzfAJOUSKA,8477
259
260
  letta/tracing.py,sha256=0uCH8j2ipTpS8Vt7bFl74sG5ckgBHy9fu-cyG9SBSsc,7464
260
261
  letta/utils.py,sha256=AdHrQ2OQ3V4XhJ1LtYwbLUO71j2IJY37cIUxXPgaaRY,32125
261
- letta_nightly-0.6.32.dev20250225104119.dist-info/LICENSE,sha256=mExtuZ_GYJgDEI38GWdiEYZizZS4KkVt2SF1g_GPNhI,10759
262
- letta_nightly-0.6.32.dev20250225104119.dist-info/METADATA,sha256=R8eMoc-x1LL9sjN35D3MHZMMDEPcM4F65C3UakfDp-s,22589
263
- letta_nightly-0.6.32.dev20250225104119.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
264
- letta_nightly-0.6.32.dev20250225104119.dist-info/entry_points.txt,sha256=2zdiyGNEZGV5oYBuS-y2nAAgjDgcC9yM_mHJBFSRt5U,40
265
- letta_nightly-0.6.32.dev20250225104119.dist-info/RECORD,,
262
+ letta_nightly-0.6.33.dev20250226104113.dist-info/LICENSE,sha256=mExtuZ_GYJgDEI38GWdiEYZizZS4KkVt2SF1g_GPNhI,10759
263
+ letta_nightly-0.6.33.dev20250226104113.dist-info/METADATA,sha256=D2ASe00YOQfo6llupyRmRkJHFJEzmUBIRE248bYxTvQ,22589
264
+ letta_nightly-0.6.33.dev20250226104113.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
265
+ letta_nightly-0.6.33.dev20250226104113.dist-info/entry_points.txt,sha256=2zdiyGNEZGV5oYBuS-y2nAAgjDgcC9yM_mHJBFSRt5U,40
266
+ letta_nightly-0.6.33.dev20250226104113.dist-info/RECORD,,