letta-nightly 0.6.16.dev20250128104041__py3-none-any.whl → 0.6.17.dev20250129174639__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 (35) hide show
  1. letta/__init__.py +1 -1
  2. letta/agent.py +0 -3
  3. letta/client/client.py +5 -5
  4. letta/client/streaming.py +29 -20
  5. letta/constants.py +1 -1
  6. letta/functions/function_sets/multi_agent.py +55 -49
  7. letta/functions/functions.py +0 -1
  8. letta/functions/helpers.py +149 -9
  9. letta/llm_api/llm_api_tools.py +20 -12
  10. letta/llm_api/openai.py +15 -13
  11. letta/orm/agent.py +14 -2
  12. letta/orm/job.py +1 -1
  13. letta/orm/sqlalchemy_base.py +12 -4
  14. letta/schemas/job.py +17 -1
  15. letta/schemas/letta_request.py +2 -7
  16. letta/schemas/llm_config.py +9 -0
  17. letta/schemas/message.py +51 -22
  18. letta/schemas/openai/chat_completion_response.py +2 -2
  19. letta/schemas/run.py +1 -2
  20. letta/server/rest_api/app.py +5 -1
  21. letta/server/rest_api/chat_completions_interface.py +256 -0
  22. letta/server/rest_api/optimistic_json_parser.py +185 -0
  23. letta/server/rest_api/routers/openai/chat_completions/__init__.py +0 -0
  24. letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +161 -0
  25. letta/server/rest_api/routers/v1/agents.py +22 -32
  26. letta/server/server.py +12 -12
  27. letta/services/job_manager.py +7 -12
  28. letta/services/tool_manager.py +17 -1
  29. letta/system.py +20 -0
  30. letta/utils.py +24 -1
  31. {letta_nightly-0.6.16.dev20250128104041.dist-info → letta_nightly-0.6.17.dev20250129174639.dist-info}/METADATA +4 -4
  32. {letta_nightly-0.6.16.dev20250128104041.dist-info → letta_nightly-0.6.17.dev20250129174639.dist-info}/RECORD +35 -31
  33. {letta_nightly-0.6.16.dev20250128104041.dist-info → letta_nightly-0.6.17.dev20250129174639.dist-info}/LICENSE +0 -0
  34. {letta_nightly-0.6.16.dev20250128104041.dist-info → letta_nightly-0.6.17.dev20250129174639.dist-info}/WHEEL +0 -0
  35. {letta_nightly-0.6.16.dev20250128104041.dist-info → letta_nightly-0.6.17.dev20250129174639.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,5 @@
1
1
  from datetime import datetime
2
- from typing import Annotated, List, Optional, Union
2
+ from typing import Annotated, List, Optional
3
3
 
4
4
  from fastapi import APIRouter, BackgroundTasks, Body, Depends, Header, HTTPException, Query, status
5
5
  from fastapi.responses import JSONResponse
@@ -10,7 +10,7 @@ from letta.log import get_logger
10
10
  from letta.orm.errors import NoResultFound
11
11
  from letta.schemas.agent import AgentState, CreateAgent, UpdateAgent
12
12
  from letta.schemas.block import Block, BlockUpdate, CreateBlock # , BlockLabelUpdate, BlockLimitUpdate
13
- from letta.schemas.job import JobStatus, JobUpdate
13
+ from letta.schemas.job import JobStatus, JobUpdate, LettaRequestConfig
14
14
  from letta.schemas.letta_message import LettaMessageUnion
15
15
  from letta.schemas.letta_request import LettaRequest, LettaStreamingRequest
16
16
  from letta.schemas.letta_response import LettaResponse
@@ -392,15 +392,7 @@ def delete_archival_memory(
392
392
 
393
393
 
394
394
  AgentMessagesResponse = Annotated[
395
- Union[List[Message], List[LettaMessageUnion]],
396
- Field(
397
- json_schema_extra={
398
- "anyOf": [
399
- {"type": "array", "items": {"$ref": "#/components/schemas/Message"}},
400
- {"type": "array", "items": {"$ref": "#/components/schemas/LettaMessageUnion"}},
401
- ]
402
- }
403
- ),
395
+ List[LettaMessageUnion], Field(json_schema_extra={"type": "array", "items": {"$ref": "#/components/schemas/LettaMessageUnion"}})
404
396
  ]
405
397
 
406
398
 
@@ -411,16 +403,9 @@ def list_messages(
411
403
  after: Optional[str] = Query(None, description="Message after which to retrieve the returned messages."),
412
404
  before: Optional[str] = Query(None, description="Message before which to retrieve the returned messages."),
413
405
  limit: int = Query(10, description="Maximum number of messages to retrieve."),
414
- msg_object: bool = Query(False, description="If true, returns Message objects. If false, return LettaMessage objects."),
415
- # Flags to support the use of AssistantMessage message types
416
- assistant_message_tool_name: str = Query(
417
- DEFAULT_MESSAGE_TOOL,
418
- description="The name of the designated message tool.",
419
- ),
420
- assistant_message_tool_kwarg: str = Query(
421
- DEFAULT_MESSAGE_TOOL_KWARG,
422
- description="The name of the message argument in the designated message tool.",
423
- ),
406
+ use_assistant_message: bool = Query(True, description="Whether to use assistant messages"),
407
+ assistant_message_tool_name: str = Query(DEFAULT_MESSAGE_TOOL, description="The name of the designated message tool."),
408
+ assistant_message_tool_kwarg: str = Query(DEFAULT_MESSAGE_TOOL_KWARG, description="The name of the message argument."),
424
409
  user_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
425
410
  ):
426
411
  """
@@ -435,7 +420,8 @@ def list_messages(
435
420
  before=before,
436
421
  limit=limit,
437
422
  reverse=True,
438
- return_message_object=msg_object,
423
+ return_message_object=False,
424
+ use_assistant_message=use_assistant_message,
439
425
  assistant_message_tool_name=assistant_message_tool_name,
440
426
  assistant_message_tool_kwarg=assistant_message_tool_kwarg,
441
427
  )
@@ -480,9 +466,9 @@ async def send_message(
480
466
  stream_steps=False,
481
467
  stream_tokens=False,
482
468
  # Support for AssistantMessage
483
- use_assistant_message=request.config.use_assistant_message,
484
- assistant_message_tool_name=request.config.assistant_message_tool_name,
485
- assistant_message_tool_kwarg=request.config.assistant_message_tool_kwarg,
469
+ use_assistant_message=request.use_assistant_message,
470
+ assistant_message_tool_name=request.assistant_message_tool_name,
471
+ assistant_message_tool_kwarg=request.assistant_message_tool_kwarg,
486
472
  )
487
473
  return result
488
474
 
@@ -520,9 +506,9 @@ async def send_message_streaming(
520
506
  stream_steps=True,
521
507
  stream_tokens=request.stream_tokens,
522
508
  # Support for AssistantMessage
523
- use_assistant_message=request.config.use_assistant_message,
524
- assistant_message_tool_name=request.config.assistant_message_tool_name,
525
- assistant_message_tool_kwarg=request.config.assistant_message_tool_kwarg,
509
+ use_assistant_message=request.use_assistant_message,
510
+ assistant_message_tool_name=request.assistant_message_tool_name,
511
+ assistant_message_tool_kwarg=request.assistant_message_tool_kwarg,
526
512
  )
527
513
  return result
528
514
 
@@ -597,7 +583,11 @@ async def send_message_async(
597
583
  "job_type": "send_message_async",
598
584
  "agent_id": agent_id,
599
585
  },
600
- request_config=request.config,
586
+ request_config=LettaRequestConfig(
587
+ use_assistant_message=request.use_assistant_message,
588
+ assistant_message_tool_name=request.assistant_message_tool_name,
589
+ assistant_message_tool_kwarg=request.assistant_message_tool_kwarg,
590
+ ),
601
591
  )
602
592
  run = server.job_manager.create_job(pydantic_job=run, actor=actor)
603
593
 
@@ -609,9 +599,9 @@ async def send_message_async(
609
599
  actor=actor,
610
600
  agent_id=agent_id,
611
601
  messages=request.messages,
612
- use_assistant_message=request.config.use_assistant_message,
613
- assistant_message_tool_name=request.config.assistant_message_tool_name,
614
- assistant_message_tool_kwarg=request.config.assistant_message_tool_kwarg,
602
+ use_assistant_message=request.use_assistant_message,
603
+ assistant_message_tool_name=request.assistant_message_tool_name,
604
+ assistant_message_tool_kwarg=request.assistant_message_tool_kwarg,
615
605
  )
616
606
 
617
607
  return run
letta/server/server.py CHANGED
@@ -62,6 +62,7 @@ from letta.schemas.source import Source
62
62
  from letta.schemas.tool import Tool
63
63
  from letta.schemas.usage import LettaUsageStatistics
64
64
  from letta.schemas.user import User
65
+ from letta.server.rest_api.chat_completions_interface import ChatCompletionsStreamingInterface
65
66
  from letta.server.rest_api.interface import StreamingServerInterface
66
67
  from letta.server.rest_api.utils import sse_async_generator
67
68
  from letta.services.agent_manager import AgentManager
@@ -206,7 +207,7 @@ if settings.letta_pg_uri_no_default:
206
207
  else:
207
208
  # TODO: don't rely on config storage
208
209
  engine_path = "sqlite:///" + os.path.join(config.recall_storage_path, "sqlite.db")
209
- print("Creating sqlite engine", engine_path)
210
+ logger.info("Creating sqlite engine " + engine_path)
210
211
 
211
212
  engine = create_engine(engine_path)
212
213
 
@@ -719,7 +720,7 @@ class SyncServer(Server):
719
720
  # whether or not to wrap user and system message as MemGPT-style stringified JSON
720
721
  wrap_user_message: bool = True,
721
722
  wrap_system_message: bool = True,
722
- interface: Union[AgentInterface, None] = None, # needed to getting responses
723
+ interface: Union[AgentInterface, ChatCompletionsStreamingInterface, None] = None, # needed to getting responses
723
724
  metadata: Optional[dict] = None, # Pass through metadata to interface
724
725
  ) -> LettaUsageStatistics:
725
726
  """Send a list of messages to the agent
@@ -735,7 +736,7 @@ class SyncServer(Server):
735
736
  for message in messages:
736
737
  assert isinstance(message, MessageCreate)
737
738
 
738
- # If wrapping is eanbled, wrap with metadata before placing content inside the Message object
739
+ # If wrapping is enabled, wrap with metadata before placing content inside the Message object
739
740
  if message.role == MessageRole.user and wrap_user_message:
740
741
  message.content = system.package_user_message(user_message=message.content)
741
742
  elif message.role == MessageRole.system and wrap_system_message:
@@ -870,6 +871,7 @@ class SyncServer(Server):
870
871
  limit: Optional[int] = 100,
871
872
  reverse: Optional[bool] = False,
872
873
  return_message_object: bool = True,
874
+ use_assistant_message: bool = True,
873
875
  assistant_message_tool_name: str = constants.DEFAULT_MESSAGE_TOOL,
874
876
  assistant_message_tool_kwarg: str = constants.DEFAULT_MESSAGE_TOOL_KWARG,
875
877
  ) -> Union[List[Message], List[LettaMessage]]:
@@ -889,14 +891,12 @@ class SyncServer(Server):
889
891
  )
890
892
 
891
893
  if not return_message_object:
892
- records = [
893
- msg
894
- for m in records
895
- for msg in m.to_letta_message(
896
- assistant_message_tool_name=assistant_message_tool_name,
897
- assistant_message_tool_kwarg=assistant_message_tool_kwarg,
898
- )
899
- ]
894
+ records = Message.to_letta_messages_from_list(
895
+ messages=records,
896
+ use_assistant_message=use_assistant_message,
897
+ assistant_message_tool_name=assistant_message_tool_name,
898
+ assistant_message_tool_kwarg=assistant_message_tool_kwarg,
899
+ )
900
900
 
901
901
  if reverse:
902
902
  records = records[::-1]
@@ -1289,7 +1289,7 @@ class SyncServer(Server):
1289
1289
  llm_config.model_endpoint_type not in ["openai", "anthropic"] or "inference.memgpt.ai" in llm_config.model_endpoint
1290
1290
  ):
1291
1291
  warnings.warn(
1292
- "Token streaming is only supported for models with type 'openai', 'anthropic', or `inference.memgpt.ai` in the model_endpoint: agent has endpoint type {llm_config.model_endpoint_type} and {llm_config.model_endpoint}. Setting stream_tokens to False."
1292
+ f"Token streaming is only supported for models with type 'openai' or 'anthropic' in the model_endpoint: agent has endpoint type {llm_config.model_endpoint_type} and {llm_config.model_endpoint}. Setting stream_tokens to False."
1293
1293
  )
1294
1294
  stream_tokens = False
1295
1295
 
@@ -14,9 +14,8 @@ from letta.orm.sqlalchemy_base import AccessType
14
14
  from letta.orm.step import Step
15
15
  from letta.schemas.enums import JobStatus, MessageRole
16
16
  from letta.schemas.job import Job as PydanticJob
17
- from letta.schemas.job import JobUpdate
17
+ from letta.schemas.job import JobUpdate, LettaRequestConfig
18
18
  from letta.schemas.letta_message import LettaMessage
19
- from letta.schemas.letta_request import LettaRequestConfig
20
19
  from letta.schemas.message import Message as PydanticMessage
21
20
  from letta.schemas.run import Run as PydanticRun
22
21
  from letta.schemas.usage import LettaUsageStatistics
@@ -303,16 +302,12 @@ class JobManager:
303
302
 
304
303
  request_config = self._get_run_request_config(run_id)
305
304
 
306
- # Convert messages to LettaMessages
307
- messages = [
308
- msg
309
- for m in messages
310
- for msg in m.to_letta_message(
311
- assistant_message=request_config["use_assistant_message"],
312
- assistant_message_tool_name=request_config["assistant_message_tool_name"],
313
- assistant_message_tool_kwarg=request_config["assistant_message_tool_kwarg"],
314
- )
315
- ]
305
+ messages = PydanticMessage.to_letta_messages_from_list(
306
+ messages=messages,
307
+ use_assistant_message=request_config["use_assistant_message"],
308
+ assistant_message_tool_name=request_config["assistant_message_tool_name"],
309
+ assistant_message_tool_kwarg=request_config["assistant_message_tool_kwarg"],
310
+ )
316
311
 
317
312
  return messages
318
313
 
@@ -4,6 +4,7 @@ from typing import List, Optional
4
4
 
5
5
  from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS, MULTI_AGENT_TOOLS
6
6
  from letta.functions.functions import derive_openai_json_schema, load_function_set
7
+ from letta.log import get_logger
7
8
  from letta.orm.enums import ToolType
8
9
 
9
10
  # TODO: Remove this once we translate all of these to the ORM
@@ -14,6 +15,8 @@ from letta.schemas.tool import ToolUpdate
14
15
  from letta.schemas.user import User as PydanticUser
15
16
  from letta.utils import enforce_types, printd
16
17
 
18
+ logger = get_logger(__name__)
19
+
17
20
 
18
21
  class ToolManager:
19
22
  """Manager class to handle business logic related to Tools."""
@@ -102,7 +105,20 @@ class ToolManager:
102
105
  limit=limit,
103
106
  organization_id=actor.organization_id,
104
107
  )
105
- return [tool.to_pydantic() for tool in tools]
108
+
109
+ # Remove any malformed tools
110
+ results = []
111
+ for tool in tools:
112
+ try:
113
+ pydantic_tool = tool.to_pydantic()
114
+ results.append(pydantic_tool)
115
+ except (ValueError, ModuleNotFoundError, AttributeError) as e:
116
+ logger.warning(f"Deleting malformed tool with id={tool.id} and name={tool.name}, error was:\n{e}")
117
+ logger.warning("Deleted tool: ")
118
+ logger.warning(tool.pretty_print_columns())
119
+ self.delete_tool_by_id(tool.id, actor=actor)
120
+
121
+ return results
106
122
 
107
123
  @enforce_types
108
124
  def update_tool_by_id(self, tool_id: str, tool_update: ToolUpdate, actor: PydanticUser) -> PydanticTool:
letta/system.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import json
2
2
  import uuid
3
+ import warnings
3
4
  from typing import Optional
4
5
 
5
6
  from .constants import (
@@ -205,3 +206,22 @@ def get_token_limit_warning():
205
206
  }
206
207
 
207
208
  return json_dumps(packaged_message)
209
+
210
+
211
+ def unpack_message(packed_message) -> str:
212
+ """Take a packed message string and attempt to extract the inner message content"""
213
+
214
+ try:
215
+ message_json = json.loads(packed_message)
216
+ except:
217
+ warnings.warn(f"Was unable to load message as JSON to unpack: ''{packed_message}")
218
+ return packed_message
219
+
220
+ if "message" not in message_json:
221
+ if "type" in message_json and message_json["type"] in ["login", "heartbeat"]:
222
+ # This is a valid user message that the ADE expects, so don't print warning
223
+ return packed_message
224
+ warnings.warn(f"Was unable to find 'message' field in packed message object: '{packed_message}'")
225
+ return packed_message
226
+ else:
227
+ return message_json.get("message")
letta/utils.py CHANGED
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  import copy
2
3
  import difflib
3
4
  import hashlib
@@ -15,7 +16,7 @@ import uuid
15
16
  from contextlib import contextmanager
16
17
  from datetime import datetime, timedelta, timezone
17
18
  from functools import wraps
18
- from typing import List, Union, _GenericAlias, get_args, get_origin, get_type_hints
19
+ from typing import Any, Coroutine, List, Union, _GenericAlias, get_args, get_origin, get_type_hints
19
20
  from urllib.parse import urljoin, urlparse
20
21
 
21
22
  import demjson3 as demjson
@@ -1127,3 +1128,25 @@ def get_friendly_error_msg(function_name: str, exception_name: str, exception_me
1127
1128
  if len(error_msg) > MAX_ERROR_MESSAGE_CHAR_LIMIT:
1128
1129
  error_msg = error_msg[:MAX_ERROR_MESSAGE_CHAR_LIMIT]
1129
1130
  return error_msg
1131
+
1132
+
1133
+ def run_async_task(coro: Coroutine[Any, Any, Any]) -> Any:
1134
+ """
1135
+ Safely runs an asynchronous coroutine in a synchronous context.
1136
+
1137
+ If an event loop is already running, it uses `asyncio.ensure_future`.
1138
+ Otherwise, it creates a new event loop and runs the coroutine.
1139
+
1140
+ Args:
1141
+ coro: The coroutine to execute.
1142
+
1143
+ Returns:
1144
+ The result of the coroutine.
1145
+ """
1146
+ try:
1147
+ # If there's already a running event loop, schedule the coroutine
1148
+ loop = asyncio.get_running_loop()
1149
+ return asyncio.run_until_complete(coro) if loop.is_closed() else asyncio.ensure_future(coro)
1150
+ except RuntimeError:
1151
+ # If no event loop is running, create a new one
1152
+ return asyncio.run(coro)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: letta-nightly
3
- Version: 0.6.16.dev20250128104041
3
+ Version: 0.6.17.dev20250129174639
4
4
  Summary: Create LLM agents with long-term memory and custom tools
5
5
  License: Apache License
6
6
  Author: Letta Team
@@ -26,8 +26,8 @@ Requires-Dist: autoflake (>=2.3.0,<3.0.0) ; extra == "dev" or extra == "all"
26
26
  Requires-Dist: black[jupyter] (>=24.2.0,<25.0.0) ; extra == "dev" or extra == "all"
27
27
  Requires-Dist: brotli (>=1.1.0,<2.0.0)
28
28
  Requires-Dist: colorama (>=0.4.6,<0.5.0)
29
- Requires-Dist: composio-core (>=0.6.15,<0.7.0)
30
- Requires-Dist: composio-langchain (>=0.6.15,<0.7.0)
29
+ Requires-Dist: composio-core (>=0.6.19,<0.7.0)
30
+ Requires-Dist: composio-langchain (>=0.6.19,<0.7.0)
31
31
  Requires-Dist: datasets (>=2.14.6,<3.0.0) ; extra == "dev" or extra == "all"
32
32
  Requires-Dist: demjson3 (>=3.0.6,<4.0.0)
33
33
  Requires-Dist: docker (>=7.1.0,<8.0.0) ; extra == "external-tools" or extra == "all"
@@ -44,7 +44,7 @@ Requires-Dist: isort (>=5.13.2,<6.0.0) ; extra == "dev" or extra == "all"
44
44
  Requires-Dist: jinja2 (>=3.1.5,<4.0.0)
45
45
  Requires-Dist: langchain (>=0.3.7,<0.4.0) ; extra == "external-tools" or extra == "all"
46
46
  Requires-Dist: langchain-community (>=0.3.7,<0.4.0) ; extra == "external-tools" or extra == "all"
47
- Requires-Dist: letta_client (>=0.1.16,<0.2.0)
47
+ Requires-Dist: letta_client (>=0.1.23,<0.2.0)
48
48
  Requires-Dist: llama-index (>=0.12.2,<0.13.0)
49
49
  Requires-Dist: llama-index-embeddings-openai (>=0.3.1,<0.4.0)
50
50
  Requires-Dist: locust (>=2.31.5,<3.0.0) ; extra == "dev" or extra == "all"
@@ -1,6 +1,6 @@
1
- letta/__init__.py,sha256=f4jKUd8LM4lY5v3oLSX-PcCxmD4qajTjqAcpXj_AcQY,919
1
+ letta/__init__.py,sha256=45zX5RUC_aJSVvqltsKJXMJfygW8OOpzVbqb9unbegU,919
2
2
  letta/__main__.py,sha256=6Hs2PV7EYc5Tid4g4OtcLXhqVHiNYTGzSBdoOnW2HXA,29
3
- letta/agent.py,sha256=aIzscF44Vr6m6s29h9iEHgZaTqzbxneGmvQyMIROErw,56679
3
+ letta/agent.py,sha256=VzVh9ZpRElA1n0pGqMkb70FXatOn_Yk1Zaa-aWIpUZE,56526
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
@@ -8,11 +8,11 @@ letta/cli/cli.py,sha256=_uGKM-RvGLGf7y8iWjkLgLTxIw7uWrdCdL5ETUOCkUs,16472
8
8
  letta/cli/cli_config.py,sha256=2oo4vui1GXQarAD6Ru4SRzPvcW4eX2mCXOBusfYGvJw,8533
9
9
  letta/cli/cli_load.py,sha256=xFw-CuzjChcIptaqQ1XpDROENt0JSjyPeiQ0nmEeO1k,2706
10
10
  letta/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- letta/client/client.py,sha256=S6p3kLpztox4kTob-iwcTuIZMVcQzFWQPwfopVf-Rbc,138725
12
- letta/client/streaming.py,sha256=Vkf5iz6h9FwiCmpYTrtMR162HQZNqrpHHWQlhUjpxQA,4873
11
+ letta/client/client.py,sha256=-h6V_PUunYouEmw_TI0BalEvQcQ9uIOfLBnDMrDSYQQ,138785
12
+ letta/client/streaming.py,sha256=DzE86XJTg_0j9eC45Hrpy9vPt-Wfo1F-sIv_B7iNV6I,5509
13
13
  letta/client/utils.py,sha256=VCGV-op5ZSmurd4yw7Vhf93XDQ0BkyBT8qsuV7EqfiU,2859
14
14
  letta/config.py,sha256=JFGY4TWW0Wm5fTbZamOwWqk5G8Nn-TXyhgByGoAqy2c,12375
15
- letta/constants.py,sha256=CTJa3eFroiQIPg2iCxT_9PqV5IogJKEZLc78K70Ou-Q,7118
15
+ letta/constants.py,sha256=FHCoIheWu7DQwKjn_x6JbMUCgv99AzNAXylVsKYeCfs,7159
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=VgqbUqYL6oTuLOKGOd_8swTRMYIpRTIWJbBthjT8eR8,8838
@@ -21,9 +21,9 @@ letta/functions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  letta/functions/ast_parsers.py,sha256=MEFfGxpflUsw34JiY9zdunkpbczAYxte8t4rDPOmXfQ,3620
22
22
  letta/functions/function_sets/base.py,sha256=bOiitkhzqYKwZBiRYrx29AlordiA5IrXw25eVSRK8BY,5984
23
23
  letta/functions/function_sets/extras.py,sha256=Z9yEdBpQFtTjpxkgbtkWMA8GtDWC6ai2bdsRpnv0H_w,4837
24
- letta/functions/function_sets/multi_agent.py,sha256=Z5x0J71l_14FDd0QbQ0rNqCb5UVRkSKH-u2cPrQPF4o,3838
25
- letta/functions/functions.py,sha256=wxxo6MJXBfcPeEc1YYWK5ENOD3RFNTIc65RTDBo77x4,5673
26
- letta/functions/helpers.py,sha256=iG6KVUDamhJuWNxVANtZB5GSSEUv1KWQTRnb5fVNh4Q,14045
24
+ letta/functions/function_sets/multi_agent.py,sha256=QPtAW70V93W6BL1CfPD9xI2eE8Y0aIwdVU2V0CkJ_9I,4832
25
+ letta/functions/functions.py,sha256=NyWLh7a-f4mXti5vM1oWDwXzfA58VmVVqL03O9vosKY,5672
26
+ letta/functions/helpers.py,sha256=7T02M73oWwUn3rAAFEIPnNLbewqJ0MB81gF4ok9py00,19300
27
27
  letta/functions/schema_generator.py,sha256=qosgp3p27QRTqOCPLrSkCGVdyQsyTTZunXQ_g-YaTkw,20138
28
28
  letta/helpers/__init__.py,sha256=p0luQ1Oe3Skc6sH4O58aHHA3Qbkyjifpuq0DZ1GAY0U,59
29
29
  letta/helpers/tool_rule_solver.py,sha256=VnJfqb5L1Lcipc_tBVGj0om60GKQkMkNLgg6X9VZl2c,6210
@@ -39,9 +39,9 @@ letta/llm_api/azure_openai_constants.py,sha256=oXtKrgBFHf744gyt5l1thILXgyi8NDNUr
39
39
  letta/llm_api/cohere.py,sha256=H5kzYH_aQAnGNq7lip7XyKGLEOKC318Iw0_tiTP6kc4,14772
40
40
  letta/llm_api/google_ai.py,sha256=MIX4nmyC6448AvyPPSE8JZ_tzSpKJTArkZSfQGGoy0M,17920
41
41
  letta/llm_api/helpers.py,sha256=ov9WHsLSvkceIpSNJ3PUgCvufD862Bcrum-bWrUVJko,16193
42
- letta/llm_api/llm_api_tools.py,sha256=LxaXhc9x_zj68lzGig832qK7RqJZqFzgeUFMd3_5O3U,20040
42
+ letta/llm_api/llm_api_tools.py,sha256=Ur3Wr5FnrcnRpJi5EpSbVe0yVB4iij81VOS278faYwY,20174
43
43
  letta/llm_api/mistral.py,sha256=fHdfD9ug-rQIk2qn8tRKay1U6w9maF11ryhKi91FfXM,1593
44
- letta/llm_api/openai.py,sha256=AjMJFpFI02cWsv_ih8zLlgifwQ-dWosTDGGuASHqwzg,20247
44
+ letta/llm_api/openai.py,sha256=FRGtfE10fyv2QxePKjHUKBfzG1954E1BKyrbHy74kV4,20331
45
45
  letta/local_llm/README.md,sha256=hFJyw5B0TU2jrh9nb0zGZMgdH-Ei1dSRfhvPQG_NSoU,168
46
46
  letta/local_llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
47
  letta/local_llm/chat_completion_proxy.py,sha256=ElYR0M5SY2zL4NQzInye21MxqtiP3AUXX9Ia0KbkD4Y,12948
@@ -87,7 +87,7 @@ letta/openai_backcompat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
87
87
  letta/openai_backcompat/openai_object.py,sha256=Y1ZS1sATP60qxJiOsjOP3NbwSzuzvkNAvb3DeuhM5Uk,13490
88
88
  letta/orm/__all__.py,sha256=2gh2MZTkA3Hw67VWVKK3JIStJOqTeLdpCvYSVYNeEDA,692
89
89
  letta/orm/__init__.py,sha256=wPokP-EvOri2LhKLjmYVtI_FWchaxgFvJeF_NAfqJIo,842
90
- letta/orm/agent.py,sha256=nNdRyaN6osj5pUP3wCfhtrijauEQyfQJSik2bgb6RxY,6441
90
+ letta/orm/agent.py,sha256=CdcpVFfuFkGeaInVTaUTCjavUOhOZ3HsguCXs6fYBY4,6859
91
91
  letta/orm/agents_tags.py,sha256=dYSnHz4IWBjyOiQ4RJomX3P0QN76JTlEZEw5eJM6Emg,925
92
92
  letta/orm/base.py,sha256=VjvxF9TwKF9Trf8BJkDgf7D6KrWWopOkUiF18J3IElk,3071
93
93
  letta/orm/block.py,sha256=EjH8lXexHtFIHJ8G-RjNo2oAH834x0Hbn4CER9S4U74,3880
@@ -96,7 +96,7 @@ letta/orm/custom_columns.py,sha256=EML5AE5FQ4ugI8MGj4yqfmwBrw7YAcp4_dO6i9oQs6I,5
96
96
  letta/orm/enums.py,sha256=HzX3eXhBH-PnpxhBWtWbkV4J6wrStlJaX_OVdZgAdLU,428
97
97
  letta/orm/errors.py,sha256=Se0Guz-gqi-D36NUWSh7AP9zTVCSph9KgZh_trwng4o,734
98
98
  letta/orm/file.py,sha256=7_p7LxityP3NQZVURQYG0kgcZhEkVuMN0Fj4h9YOe1w,1780
99
- letta/orm/job.py,sha256=zcXy44wNVnGMo4IKAkRzctngwWAtO97W1WzLjYIKarA,2167
99
+ letta/orm/job.py,sha256=G2P-xUpTapD4lhU2FwMZET1b5QR4ju9WOB3uiTKD_mw,2157
100
100
  letta/orm/job_messages.py,sha256=SgwaYPYwwAC3dBtl9Xye_TWUl9H_-m95S95TTcfPyOg,1245
101
101
  letta/orm/message.py,sha256=qY5lhSq5JDOSGKnEnLryKr2bHYLr60pk2LqYBxGeONQ,2718
102
102
  letta/orm/mixins.py,sha256=9c79Kfr-Z1hL-SDYKeoptx_yMTbBwJJBo9nrKEzSDAc,1622
@@ -106,7 +106,7 @@ letta/orm/provider.py,sha256=-qA9tvKTZgaM4D7CoDZZiA7zTgjaaWDV4jZvifQv_MM,805
106
106
  letta/orm/sandbox_config.py,sha256=DyOy_1_zCMlp13elCqPcuuA6OwUove6mrjhcpROTg50,4150
107
107
  letta/orm/source.py,sha256=cpaleNiP-DomM2oopwgL2DGn38ITQwLMs5mKODf_c_4,2167
108
108
  letta/orm/sources_agents.py,sha256=Ik_PokCBrXRd9wXWomeNeb8EtLUwjb9VMZ8LWXqpK5A,473
109
- letta/orm/sqlalchemy_base.py,sha256=scF7umxCxw0cV6szlNzlROLbV7-ppT4_Btrt7AHU3FQ,21513
109
+ letta/orm/sqlalchemy_base.py,sha256=jhhF3A_k5j3wxyZ-C_n6kwvQIZ1iU3-vvcke3QarLBA,21901
110
110
  letta/orm/sqlite_functions.py,sha256=JCScKiRlYCKxy9hChQ8wsk4GMKknZE24MunnG3fM1Gw,4255
111
111
  letta/orm/step.py,sha256=6ygEnkQSIMxNH08Om0a-UK-f2E66QSpp9GdGm7mGjFg,2853
112
112
  letta/orm/tool.py,sha256=JEPHlM4ePaLaGtHpHhYdKCteHTRJnOFgQmfR5wL8TpA,2379
@@ -147,24 +147,24 @@ letta/schemas/enums.py,sha256=UUkeGQNw-9vButo1AXVZLKggLo8QsfO8Zm_fM5pD_zA,1125
147
147
  letta/schemas/environment_variables.py,sha256=VRtzOjdeQdHcSHXisk7oJUQlheruxhSWNS0xqlfGzbs,2429
148
148
  letta/schemas/file.py,sha256=ChN2CWzLI2TT9WLItcfElEH0E8b7kzPylF2OQBr6Beg,1550
149
149
  letta/schemas/health.py,sha256=zT6mYovvD17iJRuu2rcaQQzbEEYrkwvAE9TB7iU824c,139
150
- letta/schemas/job.py,sha256=pbLNNH1D9HAncGelkvUcG4LUf23hl9FGKeldNzteLq8,1550
150
+ letta/schemas/job.py,sha256=MX9EiLDDIeHm3q52ImOjp7UzXEdYTXAWWobRCAxwV0w,2225
151
151
  letta/schemas/letta_base.py,sha256=HTnSHJ2YSyhEdpY-vg9Y7ywqS1zzTjb9j5iVPYsuVSk,3991
152
152
  letta/schemas/letta_message.py,sha256=QHzIEwnEJEkE02biCwyQo5IvL2fVq_whBRQD3vPYO48,9837
153
- letta/schemas/letta_request.py,sha256=YRLjzGHQusj0NIue2AjCN-6j0cvxZ_DJQKjgTpT3fPc,1355
153
+ letta/schemas/letta_request.py,sha256=dzy3kwb5j2QLaSV0sDlwISEMt2xxH3IiK-vR9xJV65k,1123
154
154
  letta/schemas/letta_response.py,sha256=yL0w-cdUazgEqg6_F4LJz2tugKNAZsB83Gr5jfXwa5U,7124
155
- letta/schemas/llm_config.py,sha256=d18QhSjy8TxtXior00PQE3Q8Kk2gbyvFPF6GmMnjEuc,4934
155
+ letta/schemas/llm_config.py,sha256=lycAmLNvAm6D35jlLBN333x3tpzdk2Fwkx6yJl3pXjQ,5273
156
156
  letta/schemas/llm_config_overrides.py,sha256=-oRglCTcajF6UAK3RAa0FLWVuKODPI1v403fDIWMAtA,1815
157
157
  letta/schemas/memory.py,sha256=GOYDfPKzbWftUWO9Hv4KW7xAi1EIQmC8zpP7qvEkVHw,10245
158
- letta/schemas/message.py,sha256=ioPZqUYO5Wqjt54XTeaQdyvdJMm70RdQ9gpwXV0rCJI,36216
158
+ letta/schemas/message.py,sha256=4L0-B2gCA2krF34AkKi_G4L2X5aALQnH997MowIcQgs,37457
159
159
  letta/schemas/openai/chat_completion_request.py,sha256=AOIwgbN3CZKVqkuXeMHeSa53u4h0wVq69t3T_LJ0vIE,3389
160
- letta/schemas/openai/chat_completion_response.py,sha256=ub-oVSyLpuJd-5_yzCSIRR8tD3GM83IeDO1c1uAATa4,3970
160
+ letta/schemas/openai/chat_completion_response.py,sha256=Kaz9T0_ZvhWdVgGcouBuUuAG8-Nl3kC3dRymBQlONZ4,3980
161
161
  letta/schemas/openai/chat_completions.py,sha256=l0e9sT9boTD5VBU5YtJ0s7qUtCfFGB2K-gQLeEZ2LHU,3599
162
162
  letta/schemas/openai/embedding_response.py,sha256=WKIZpXab1Av7v6sxKG8feW3ZtpQUNosmLVSuhXYa_xU,357
163
163
  letta/schemas/openai/openai.py,sha256=Hilo5BiLAGabzxCwnwfzK5QrWqwYD8epaEKFa4Pwndk,7970
164
164
  letta/schemas/organization.py,sha256=WWbUWVSp_VQRFwWN4fdHg1yObiV6x9rZnvIY8x5BPs0,746
165
165
  letta/schemas/passage.py,sha256=pdCLZgOn0gWK1gB6aFHLS0gfdWCBqLaiHDA0iQ12Zd8,3704
166
166
  letta/schemas/providers.py,sha256=Wd0d0jgv6z3X5t7cT1ZVoX_Qa85ecsm1gQzkOPgQFUo,34890
167
- letta/schemas/run.py,sha256=OyuAXXjL96ftOeLdqkiIKi9csGeewy-pN5SgWk-vYGg,2124
167
+ letta/schemas/run.py,sha256=SRqPRziINIiPunjOhE_NlbnQYgxTvqmbauni_yfBQRA,2085
168
168
  letta/schemas/sandbox_config.py,sha256=v32V5T73X-VxhDk0g_1RGniK985KMvg2xyLVi1dvMQY,4215
169
169
  letta/schemas/source.py,sha256=-BQVolcXA2ziCu2ztR6cbTdGUc8G7vGJy7rvpdf1hpg,2880
170
170
  letta/schemas/step.py,sha256=cCmDChQMndy7aMJGH0Z19VbzJkAeFTYuA0cJpzjW2g0,1928
@@ -176,14 +176,18 @@ letta/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
176
176
  letta/server/constants.py,sha256=yAdGbLkzlOU_dLTx0lKDmAnj0ZgRXCEaIcPJWO69eaE,92
177
177
  letta/server/generate_openapi_schema.sh,sha256=0OtBhkC1g6CobVmNEd_m2B6sTdppjbJLXaM95icejvE,371
178
178
  letta/server/rest_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
- letta/server/rest_api/app.py,sha256=bhF2LyikAQckEAqDHJ6mCCjeIT0QFEvYOkvO6dWPjD4,11460
179
+ letta/server/rest_api/app.py,sha256=PapV6EQHCGy0pxEuCj6MpawU_u3vXUb2-czyzYIBfS0,11698
180
180
  letta/server/rest_api/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
181
181
  letta/server/rest_api/auth/index.py,sha256=fQBGyVylGSRfEMLQ17cZzrHd5Y1xiVylvPqH5Rl-lXQ,1378
182
182
  letta/server/rest_api/auth_token.py,sha256=725EFEIiNj4dh70hrSd94UysmFD8vcJLrTRfNHkzxDo,774
183
+ letta/server/rest_api/chat_completions_interface.py,sha256=i9tfb9oSh14QNY-1ghWYtdgP7_RiyPHD5NcA2FKF3Dw,10195
183
184
  letta/server/rest_api/interface.py,sha256=5lf5k5GJgUaRb8NCKotSK5PZDAcpYFmKjyPlMqtc964,51881
185
+ letta/server/rest_api/optimistic_json_parser.py,sha256=1z4d9unmxMb0ou7owJ62uUQoNjNYf21FmaNdg0ZcqUU,6567
184
186
  letta/server/rest_api/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
187
+ letta/server/rest_api/routers/openai/chat_completions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
188
+ letta/server/rest_api/routers/openai/chat_completions/chat_completions.py,sha256=TjeiyEMkpWR3PBazUWs4W2XVwGVEW5NRTOFXWag62oU,6657
185
189
  letta/server/rest_api/routers/v1/__init__.py,sha256=bXEZzmvHNX7N11NDwsxyajjci7yxP-2dYIvbeJi33vA,1070
186
- letta/server/rest_api/routers/v1/agents.py,sha256=sjcBg_F_ZU00F6Ek2q8uByjV4D7bmgeqArH--6SILns,25171
190
+ letta/server/rest_api/routers/v1/agents.py,sha256=-eRRQDyWyBnP6aj6z9rJTiaidqPls1TQB1xSqGdIYGA,25041
187
191
  letta/server/rest_api/routers/v1/blocks.py,sha256=oJYOpGUTd4AhKwVolVlZPIXO2EoOrBHkyi2PdrmbtmA,3888
188
192
  letta/server/rest_api/routers/v1/health.py,sha256=pKCuVESlVOhGIb4VC4K-H82eZqfghmT6kvj2iOkkKuc,401
189
193
  letta/server/rest_api/routers/v1/jobs.py,sha256=pKihW12hQdFwt6tHQXs94yOMv6xotlhBB3Vl7Q5ASKQ,2738
@@ -198,7 +202,7 @@ letta/server/rest_api/routers/v1/tools.py,sha256=Rp2_YH7KHeP_-WHjlwqu0wxtR27wvaO
198
202
  letta/server/rest_api/routers/v1/users.py,sha256=G5DBHSkPfBgVHN2Wkm-rVYiLQAudwQczIq2Z3YLdbVo,2277
199
203
  letta/server/rest_api/static_files.py,sha256=NG8sN4Z5EJ8JVQdj19tkFa9iQ1kBPTab9f_CUxd_u4Q,3143
200
204
  letta/server/rest_api/utils.py,sha256=dsjkZzgo9Rk3fjUf1ajjiiql1eeO5DAzmXprttI7bJU,3993
201
- letta/server/server.py,sha256=bTlqKQDzYudHLflAt6kPy7K28tOhlJEoBj7gAe8tc94,59834
205
+ letta/server/server.py,sha256=Des6W1ebnorwTB6hJtalYAltmkJWUlT7ioZB3dg-1lA,59997
202
206
  letta/server/startup.sh,sha256=722uKJWB2C4q3vjn39De2zzPacaZNw_1fN1SpLGjKIo,1569
203
207
  letta/server/static_files/assets/index-048c9598.js,sha256=mR16XppvselwKCcNgONs4L7kZEVa4OEERm4lNZYtLSk,146819
204
208
  letta/server/static_files/assets/index-0e31b727.css,sha256=SBbja96uiQVLDhDOroHgM6NSl7tS4lpJRCREgSS_hA8,7672
@@ -215,7 +219,7 @@ letta/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
215
219
  letta/services/agent_manager.py,sha256=I6F-nED9Q6O_FY2-O1gHDY-OaQIxbt3FsL88DENVTfE,50287
216
220
  letta/services/block_manager.py,sha256=u56TXG46QDMbQZadDGCO7fY1vreJ69Xr_0MUF53xw4k,5519
217
221
  letta/services/helpers/agent_manager_helper.py,sha256=RH0MXLZASkP2LVbVNUfSYHrcBYZnVxFd9ejGjRK90Hw,11283
218
- letta/services/job_manager.py,sha256=TR35-2kD1xOWJhO2V_YA4cYZc5HgA7vuafZ_I8ABi3U,13237
222
+ letta/services/job_manager.py,sha256=7awEHraoEmqlDQvcQTEkb_dcZsG9eIYGWYct8exzm2E,13117
219
223
  letta/services/message_manager.py,sha256=w6-B9Zz5z9UXcd6mKhinsaCINTsmxDsH9JJsV2_qlH4,8878
220
224
  letta/services/organization_manager.py,sha256=h3hrknBhA3YQt90OeBzFnqjYM9NWKnk8jDKzXGm4AUg,3392
221
225
  letta/services/passage_manager.py,sha256=INxeNiFAluAkzmCL5jeWWimA3ONUZcck8BuCa0UYajk,7714
@@ -225,15 +229,15 @@ letta/services/sandbox_config_manager.py,sha256=eWDNTscRG9Gt_Ixho3-daOOno_9Kcebx
225
229
  letta/services/source_manager.py,sha256=0JLKIv405oS5wc6bY5k2bxxZpS9O-VwUGHVdGPbJ3e4,7676
226
230
  letta/services/step_manager.py,sha256=RngrVs2Sd_oDZv_UoQ1ToLY0RnH-6wS1DqIBPRm-Imc,2961
227
231
  letta/services/tool_execution_sandbox.py,sha256=Tjufm58V9XzeYr8oF6g5b3OV5zZ7oPWUTqcC8GsBi9k,23162
228
- letta/services/tool_manager.py,sha256=O_siJO7ZgipxJm4xLKaioEJMLvZPPucCsoLIDIU7814,8479
232
+ letta/services/tool_manager.py,sha256=dSjzjafWGrN2ksCtIMB1bwKwBDzxogyHnfe2bx3-C-4,9069
229
233
  letta/services/user_manager.py,sha256=1U8BQ_-MBkEW2wnSFV_OsTwBmRAZLN8uHLFjnDjK3hA,4308
230
234
  letta/settings.py,sha256=sHJEaLPtEnWNZDew69F9tC8YTrkBh5BWXXtzOtAneFY,6071
231
235
  letta/streaming_interface.py,sha256=lo2VAQRUJOdWTijwnXuKOC9uejqr2siUAEmZiQUXkj8,15710
232
236
  letta/streaming_utils.py,sha256=jLqFTVhUL76FeOuYk8TaRQHmPTf3HSRc2EoJwxJNK6U,11946
233
- letta/system.py,sha256=iCcjvMKXvG1sa18Suy8Gjoa0djYGiPKi3ywMECce40Y,6974
234
- letta/utils.py,sha256=FQgWuYF0CTCIyH41rVy_rD5_ATPIlBZ24ovBtf3T1tI,33291
235
- letta_nightly-0.6.16.dev20250128104041.dist-info/LICENSE,sha256=mExtuZ_GYJgDEI38GWdiEYZizZS4KkVt2SF1g_GPNhI,10759
236
- letta_nightly-0.6.16.dev20250128104041.dist-info/METADATA,sha256=muKHSh5UMMtKT00dK2J-Q102z6TzkKLw2W58ydK51a4,22156
237
- letta_nightly-0.6.16.dev20250128104041.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
238
- letta_nightly-0.6.16.dev20250128104041.dist-info/entry_points.txt,sha256=2zdiyGNEZGV5oYBuS-y2nAAgjDgcC9yM_mHJBFSRt5U,40
239
- letta_nightly-0.6.16.dev20250128104041.dist-info/RECORD,,
237
+ letta/system.py,sha256=3jevN1QOScahsuEW-cavI3GsmiNDTkWryEukb1WTRTo,7752
238
+ letta/utils.py,sha256=lgBDWKmrQrmJGPxcgamFC2aJyi6I0dX7bzLBt3YC6j0,34051
239
+ letta_nightly-0.6.17.dev20250129174639.dist-info/LICENSE,sha256=mExtuZ_GYJgDEI38GWdiEYZizZS4KkVt2SF1g_GPNhI,10759
240
+ letta_nightly-0.6.17.dev20250129174639.dist-info/METADATA,sha256=tgyuWyEUF9fknxPR4_UDvj-vfT9yORcFe47L17LOpJk,22156
241
+ letta_nightly-0.6.17.dev20250129174639.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
242
+ letta_nightly-0.6.17.dev20250129174639.dist-info/entry_points.txt,sha256=2zdiyGNEZGV5oYBuS-y2nAAgjDgcC9yM_mHJBFSRt5U,40
243
+ letta_nightly-0.6.17.dev20250129174639.dist-info/RECORD,,