letta-nightly 0.6.11.dev20250120212046__py3-none-any.whl → 0.6.12.dev20250120222244__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.

letta/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = "0.6.11"
1
+ __version__ = "0.6.12"
2
2
 
3
3
 
4
4
  # import clients
letta/client/streaming.py CHANGED
@@ -7,7 +7,7 @@ from httpx_sse import SSEError, connect_sse
7
7
  from letta.constants import OPENAI_CONTEXT_WINDOW_ERROR_SUBSTRING
8
8
  from letta.errors import LLMError
9
9
  from letta.schemas.enums import MessageStreamStatus
10
- from letta.schemas.letta_message import ReasoningMessage, ToolCallMessage, ToolReturnMessage
10
+ from letta.schemas.letta_message import AssistantMessage, ReasoningMessage, ToolCallMessage, ToolReturnMessage
11
11
  from letta.schemas.letta_response import LettaStreamingResponse
12
12
  from letta.schemas.usage import LettaUsageStatistics
13
13
 
@@ -50,6 +50,8 @@ def _sse_post(url: str, data: dict, headers: dict) -> Generator[LettaStreamingRe
50
50
  chunk_data = json.loads(sse.data)
51
51
  if "reasoning" in chunk_data:
52
52
  yield ReasoningMessage(**chunk_data)
53
+ elif "assistant_message" in chunk_data:
54
+ yield AssistantMessage(**chunk_data)
53
55
  elif "tool_call" in chunk_data:
54
56
  yield ToolCallMessage(**chunk_data)
55
57
  elif "tool_return" in chunk_data:
@@ -290,8 +290,8 @@ def start_server(
290
290
  server_logger.addHandler(stream_handler)
291
291
 
292
292
  if (os.getenv("LOCAL_HTTPS") == "true") or "--localhttps" in sys.argv:
293
- print(f"▶ Server running at: https://{host or 'localhost'}:{port or REST_DEFAULT_PORT}\n")
294
- print(f"▶ View using ADE at: https://app.letta.com/development-servers/local/dashboard")
293
+ print(f"▶ Server running at: https://{host or 'localhost'}:{port or REST_DEFAULT_PORT}")
294
+ print(f"▶ View using ADE at: https://app.letta.com/development-servers/local/dashboard\n")
295
295
  uvicorn.run(
296
296
  app,
297
297
  host=host or "localhost",
@@ -300,8 +300,8 @@ def start_server(
300
300
  ssl_certfile="certs/localhost.pem",
301
301
  )
302
302
  else:
303
- print(f"▶ Server running at: http://{host or 'localhost'}:{port or REST_DEFAULT_PORT}\n")
304
- print(f"▶ View using ADE at: https://app.letta.com/development-servers/local/dashboard")
303
+ print(f"▶ Server running at: http://{host or 'localhost'}:{port or REST_DEFAULT_PORT}")
304
+ print(f"▶ View using ADE at: https://app.letta.com/development-servers/local/dashboard\n")
305
305
  uvicorn.run(
306
306
  app,
307
307
  host=host or "localhost",
@@ -264,6 +264,7 @@ class StreamingServerInterface(AgentChunkStreamingInterface):
264
264
  self,
265
265
  multi_step=True,
266
266
  # Related to if we want to try and pass back the AssistantMessage as a special case function
267
+ use_assistant_message=False,
267
268
  assistant_message_tool_name=DEFAULT_MESSAGE_TOOL,
268
269
  assistant_message_tool_kwarg=DEFAULT_MESSAGE_TOOL_KWARG,
269
270
  # Related to if we expect inner_thoughts to be in the kwargs
@@ -295,9 +296,10 @@ class StreamingServerInterface(AgentChunkStreamingInterface):
295
296
  # self.multi_step_gen_indicator = MessageStreamStatus.done_generation
296
297
 
297
298
  # Support for AssistantMessage
298
- self.use_assistant_message = False # TODO: Remove this
299
+ self.use_assistant_message = use_assistant_message # TODO: Remove this (actually? @charles)
299
300
  self.assistant_message_tool_name = assistant_message_tool_name
300
301
  self.assistant_message_tool_kwarg = assistant_message_tool_kwarg
302
+ self.prev_assistant_message_id = None # Used to skip tool call response receipts for `send_message`
301
303
 
302
304
  # Support for inner_thoughts_in_kwargs
303
305
  self.inner_thoughts_in_kwargs = inner_thoughts_in_kwargs
@@ -308,6 +310,8 @@ class StreamingServerInterface(AgentChunkStreamingInterface):
308
310
  self.function_name_buffer = None
309
311
  self.function_args_buffer = None
310
312
  self.function_id_buffer = None
313
+ # A buffer used to store the last flushed function name
314
+ self.last_flushed_function_name = None
311
315
 
312
316
  # extra prints
313
317
  self.debug = False
@@ -434,7 +438,8 @@ class StreamingServerInterface(AgentChunkStreamingInterface):
434
438
 
435
439
  # TODO(charles) merge into logic for internal_monologue
436
440
  # special case for trapping `send_message`
437
- if self.use_assistant_message and tool_call.function:
441
+ # if self.use_assistant_message and tool_call.function:
442
+ if not self.inner_thoughts_in_kwargs and self.use_assistant_message and tool_call.function:
438
443
  if self.inner_thoughts_in_kwargs:
439
444
  raise NotImplementedError("inner_thoughts_in_kwargs with use_assistant_message not yet supported")
440
445
 
@@ -535,15 +540,28 @@ class StreamingServerInterface(AgentChunkStreamingInterface):
535
540
  # however the frontend may expect name first, then args, so to be
536
541
  # safe we'll output name first in a separate chunk
537
542
  if self.function_name_buffer:
538
- processed_chunk = ToolCallMessage(
539
- id=message_id,
540
- date=message_date,
541
- tool_call=ToolCallDelta(
542
- name=self.function_name_buffer,
543
- arguments=None,
544
- tool_call_id=self.function_id_buffer,
545
- ),
546
- )
543
+
544
+ # use_assisitant_message means that we should also not release main_json raw, and instead should only release the contents of "message": "..."
545
+ if self.use_assistant_message and self.function_name_buffer == self.assistant_message_tool_name:
546
+ processed_chunk = None
547
+
548
+ # Store the ID of the tool call so allow skipping the corresponding response
549
+ if self.function_id_buffer:
550
+ self.prev_assistant_message_id = self.function_id_buffer
551
+
552
+ else:
553
+ processed_chunk = ToolCallMessage(
554
+ id=message_id,
555
+ date=message_date,
556
+ tool_call=ToolCallDelta(
557
+ name=self.function_name_buffer,
558
+ arguments=None,
559
+ tool_call_id=self.function_id_buffer,
560
+ ),
561
+ )
562
+
563
+ # Record what the last function name we flushed was
564
+ self.last_flushed_function_name = self.function_name_buffer
547
565
  # Clear the buffer
548
566
  self.function_name_buffer = None
549
567
  self.function_id_buffer = None
@@ -559,35 +577,94 @@ class StreamingServerInterface(AgentChunkStreamingInterface):
559
577
  # If there was nothing in the name buffer, we can proceed to
560
578
  # output the arguments chunk as a ToolCallMessage
561
579
  else:
562
- # There may be a buffer from a previous chunk, for example
563
- # if the previous chunk had arguments but we needed to flush name
564
- if self.function_args_buffer:
565
- # In this case, we should release the buffer + new data at once
566
- combined_chunk = self.function_args_buffer + updates_main_json
567
- processed_chunk = ToolCallMessage(
568
- id=message_id,
569
- date=message_date,
570
- tool_call=ToolCallDelta(
571
- name=None,
572
- arguments=combined_chunk,
573
- tool_call_id=self.function_id_buffer,
574
- ),
575
- )
576
- # clear buffer
577
- self.function_args_buffer = None
578
- self.function_id_buffer = None
580
+
581
+ # use_assisitant_message means that we should also not release main_json raw, and instead should only release the contents of "message": "..."
582
+ if self.use_assistant_message and (
583
+ self.last_flushed_function_name is not None
584
+ and self.last_flushed_function_name == self.assistant_message_tool_name
585
+ ):
586
+ # do an additional parse on the updates_main_json
587
+ if self.function_args_buffer:
588
+
589
+ updates_main_json = self.function_args_buffer + updates_main_json
590
+ self.function_args_buffer = None
591
+
592
+ # Pretty gross hardcoding that assumes that if we're toggling into the keywords, we have the full prefix
593
+ match_str = '{"' + self.assistant_message_tool_kwarg + '":"'
594
+ if updates_main_json == match_str:
595
+ updates_main_json = None
596
+
597
+ else:
598
+ # Some hardcoding to strip off the trailing "}"
599
+ if updates_main_json in ["}", '"}']:
600
+ updates_main_json = None
601
+ if updates_main_json and len(updates_main_json) > 0 and updates_main_json[-1:] == '"':
602
+ updates_main_json = updates_main_json[:-1]
603
+
604
+ if not updates_main_json:
605
+ # early exit to turn into content mode
606
+ return None
607
+
608
+ # There may be a buffer from a previous chunk, for example
609
+ # if the previous chunk had arguments but we needed to flush name
610
+ if self.function_args_buffer:
611
+ # In this case, we should release the buffer + new data at once
612
+ combined_chunk = self.function_args_buffer + updates_main_json
613
+ processed_chunk = AssistantMessage(
614
+ id=message_id,
615
+ date=message_date,
616
+ assistant_message=combined_chunk,
617
+ )
618
+ # Store the ID of the tool call so allow skipping the corresponding response
619
+ if self.function_id_buffer:
620
+ self.prev_assistant_message_id = self.function_id_buffer
621
+ # clear buffer
622
+ self.function_args_buffer = None
623
+ self.function_id_buffer = None
624
+
625
+ else:
626
+ # If there's no buffer to clear, just output a new chunk with new data
627
+ processed_chunk = AssistantMessage(
628
+ id=message_id,
629
+ date=message_date,
630
+ assistant_message=updates_main_json,
631
+ )
632
+ # Store the ID of the tool call so allow skipping the corresponding response
633
+ if self.function_id_buffer:
634
+ self.prev_assistant_message_id = self.function_id_buffer
635
+ # clear buffers
636
+ self.function_id_buffer = None
579
637
  else:
580
- # If there's no buffer to clear, just output a new chunk with new data
581
- processed_chunk = ToolCallMessage(
582
- id=message_id,
583
- date=message_date,
584
- tool_call=ToolCallDelta(
585
- name=None,
586
- arguments=updates_main_json,
587
- tool_call_id=self.function_id_buffer,
588
- ),
589
- )
590
- self.function_id_buffer = None
638
+
639
+ # There may be a buffer from a previous chunk, for example
640
+ # if the previous chunk had arguments but we needed to flush name
641
+ if self.function_args_buffer:
642
+ # In this case, we should release the buffer + new data at once
643
+ combined_chunk = self.function_args_buffer + updates_main_json
644
+ processed_chunk = ToolCallMessage(
645
+ id=message_id,
646
+ date=message_date,
647
+ tool_call=ToolCallDelta(
648
+ name=None,
649
+ arguments=combined_chunk,
650
+ tool_call_id=self.function_id_buffer,
651
+ ),
652
+ )
653
+ # clear buffer
654
+ self.function_args_buffer = None
655
+ self.function_id_buffer = None
656
+ else:
657
+ # If there's no buffer to clear, just output a new chunk with new data
658
+ processed_chunk = ToolCallMessage(
659
+ id=message_id,
660
+ date=message_date,
661
+ tool_call=ToolCallDelta(
662
+ name=None,
663
+ arguments=updates_main_json,
664
+ tool_call_id=self.function_id_buffer,
665
+ ),
666
+ )
667
+ self.function_id_buffer = None
591
668
 
592
669
  # # If there's something in the main_json buffer, we should add if to the arguments and release it together
593
670
  # tool_call_delta = {}
@@ -906,6 +983,8 @@ class StreamingServerInterface(AgentChunkStreamingInterface):
906
983
  date=msg_obj.created_at,
907
984
  assistant_message=func_args[self.assistant_message_tool_kwarg],
908
985
  )
986
+ # Store the ID of the tool call so allow skipping the corresponding response
987
+ self.prev_assistant_message_id = function_call.id
909
988
  else:
910
989
  processed_chunk = ToolCallMessage(
911
990
  id=msg_obj.id,
@@ -938,13 +1017,23 @@ class StreamingServerInterface(AgentChunkStreamingInterface):
938
1017
  msg = msg.replace("Success: ", "")
939
1018
  # new_message = {"function_return": msg, "status": "success"}
940
1019
  assert msg_obj.tool_call_id is not None
941
- new_message = ToolReturnMessage(
942
- id=msg_obj.id,
943
- date=msg_obj.created_at,
944
- tool_return=msg,
945
- status="success",
946
- tool_call_id=msg_obj.tool_call_id,
947
- )
1020
+
1021
+ print(f"YYY printing the function call - {msg_obj.tool_call_id} == {self.prev_assistant_message_id} ???")
1022
+
1023
+ # Skip this is use_assistant_message is on
1024
+ if self.use_assistant_message and msg_obj.tool_call_id == self.prev_assistant_message_id:
1025
+ # Wipe the cache
1026
+ self.prev_assistant_message_id = None
1027
+ # Skip this tool call receipt
1028
+ return
1029
+ else:
1030
+ new_message = ToolReturnMessage(
1031
+ id=msg_obj.id,
1032
+ date=msg_obj.created_at,
1033
+ tool_return=msg,
1034
+ status="success",
1035
+ tool_call_id=msg_obj.tool_call_id,
1036
+ )
948
1037
 
949
1038
  elif msg.startswith("Error: "):
950
1039
  msg = msg.replace("Error: ", "", 1)
letta/server/server.py CHANGED
@@ -1215,7 +1215,6 @@ class SyncServer(Server):
1215
1215
  stream_tokens: bool,
1216
1216
  # related to whether or not we return `LettaMessage`s or `Message`s
1217
1217
  chat_completion_mode: bool = False,
1218
- timestamp: Optional[datetime] = None,
1219
1218
  # Support for AssistantMessage
1220
1219
  use_assistant_message: bool = True,
1221
1220
  assistant_message_tool_name: str = constants.DEFAULT_MESSAGE_TOOL,
@@ -1249,7 +1248,16 @@ class SyncServer(Server):
1249
1248
  stream_tokens = False
1250
1249
 
1251
1250
  # Create a new interface per request
1252
- letta_agent.interface = StreamingServerInterface(use_assistant_message)
1251
+ letta_agent.interface = StreamingServerInterface(
1252
+ # multi_step=True, # would we ever want to disable this?
1253
+ use_assistant_message=use_assistant_message,
1254
+ assistant_message_tool_name=assistant_message_tool_name,
1255
+ assistant_message_tool_kwarg=assistant_message_tool_kwarg,
1256
+ inner_thoughts_in_kwargs=(
1257
+ llm_config.put_inner_thoughts_in_kwargs if llm_config.put_inner_thoughts_in_kwargs is not None else False
1258
+ ),
1259
+ # inner_thoughts_kwarg=INNER_THOUGHTS_KWARG,
1260
+ )
1253
1261
  streaming_interface = letta_agent.interface
1254
1262
  if not isinstance(streaming_interface, StreamingServerInterface):
1255
1263
  raise ValueError(f"Agent has wrong type of interface: {type(streaming_interface)}")
@@ -1263,13 +1271,14 @@ class SyncServer(Server):
1263
1271
  # streaming_interface.function_call_legacy_mode = stream
1264
1272
 
1265
1273
  # Allow AssistantMessage is desired by client
1266
- streaming_interface.assistant_message_tool_name = assistant_message_tool_name
1267
- streaming_interface.assistant_message_tool_kwarg = assistant_message_tool_kwarg
1274
+ # streaming_interface.use_assistant_message = use_assistant_message
1275
+ # streaming_interface.assistant_message_tool_name = assistant_message_tool_name
1276
+ # streaming_interface.assistant_message_tool_kwarg = assistant_message_tool_kwarg
1268
1277
 
1269
1278
  # Related to JSON buffer reader
1270
- streaming_interface.inner_thoughts_in_kwargs = (
1271
- llm_config.put_inner_thoughts_in_kwargs if llm_config.put_inner_thoughts_in_kwargs is not None else False
1272
- )
1279
+ # streaming_interface.inner_thoughts_in_kwargs = (
1280
+ # llm_config.put_inner_thoughts_in_kwargs if llm_config.put_inner_thoughts_in_kwargs is not None else False
1281
+ # )
1273
1282
 
1274
1283
  # Offload the synchronous message_func to a separate thread
1275
1284
  streaming_interface.stream_start()
letta/streaming_utils.py CHANGED
@@ -1,4 +1,4 @@
1
- from typing import Optional
1
+ from typing import Optional, Tuple
2
2
 
3
3
  from letta.constants import DEFAULT_MESSAGE_TOOL_KWARG
4
4
 
@@ -48,7 +48,7 @@ class JSONInnerThoughtsExtractor:
48
48
  self.hold_main_json = wait_for_first_key
49
49
  self.main_json_held_buffer = ""
50
50
 
51
- def process_fragment(self, fragment):
51
+ def process_fragment(self, fragment: str) -> Tuple[str, str]:
52
52
  updates_main_json = ""
53
53
  updates_inner_thoughts = ""
54
54
  i = 0
@@ -263,8 +263,10 @@ class FunctionArgumentsStreamHandler:
263
263
  self.key_buffer = ""
264
264
  self.accumulating = True
265
265
  return None
266
+
266
267
  if chunk.strip() == "}":
267
268
  self.in_message = False
268
269
  self.message_started = False
269
270
  return None
271
+
270
272
  return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: letta-nightly
3
- Version: 0.6.11.dev20250120212046
3
+ Version: 0.6.12.dev20250120222244
4
4
  Summary: Create LLM agents with long-term memory and custom tools
5
5
  License: Apache License
6
6
  Author: Letta Team
@@ -1,4 +1,4 @@
1
- letta/__init__.py,sha256=QaqMJBz4atxaXsgFGXhOht6gYc1g_HKntbHwsiwep3s,993
1
+ letta/__init__.py,sha256=hzPeIYFlPTm3BdvaQW2D0Bu22kxEQdlkwfwDxyYtbJk,993
2
2
  letta/__main__.py,sha256=6Hs2PV7EYc5Tid4g4OtcLXhqVHiNYTGzSBdoOnW2HXA,29
3
3
  letta/agent.py,sha256=m4g4gbx4Y0SFPsGzNi6lmkwVSWPfvh2bYoQTKf1CL6A,57854
4
4
  letta/benchmark/benchmark.py,sha256=ebvnwfp3yezaXOQyGXkYCDYpsmre-b9hvNtnyx4xkG0,3701
@@ -9,7 +9,7 @@ letta/cli/cli_config.py,sha256=I5J8D0OpsDDXCTOWFqjmxQuZCGrC1oCuNbVkrKwg4VM,8544
9
9
  letta/cli/cli_load.py,sha256=xFw-CuzjChcIptaqQ1XpDROENt0JSjyPeiQ0nmEeO1k,2706
10
10
  letta/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  letta/client/client.py,sha256=EPLzfx_05J4ihIJtKwQ5rI_ncPxeK9-zLNyYaQ-ubg4,135712
12
- letta/client/streaming.py,sha256=Hz2j_hQZG2g7uhucjx2p3ybf2qjPT-vmIGCHGo87iCQ,4677
12
+ letta/client/streaming.py,sha256=mWyMMCJeYf0aGcX_-9ZeiH3egh2Fl20Yjo1acaPO4nA,4824
13
13
  letta/client/utils.py,sha256=VCGV-op5ZSmurd4yw7Vhf93XDQ0BkyBT8qsuV7EqfiU,2859
14
14
  letta/config.py,sha256=JFGY4TWW0Wm5fTbZamOwWqk5G8Nn-TXyhgByGoAqy2c,12375
15
15
  letta/constants.py,sha256=qkH98awgWUW1g9Qpb-IWqVULcLHH-lpblWeUZdLDzkY,7528
@@ -175,11 +175,11 @@ letta/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
175
175
  letta/server/constants.py,sha256=yAdGbLkzlOU_dLTx0lKDmAnj0ZgRXCEaIcPJWO69eaE,92
176
176
  letta/server/generate_openapi_schema.sh,sha256=0OtBhkC1g6CobVmNEd_m2B6sTdppjbJLXaM95icejvE,371
177
177
  letta/server/rest_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
178
- letta/server/rest_api/app.py,sha256=Frxt6N7gbUs_BiPHZNJk0c8vjW6GzBfA0uEiN7dswPs,11850
178
+ letta/server/rest_api/app.py,sha256=iFc5YNC2Wa5R0yWL3S1IrTMUHPWPWTHg5EkYbPw61ak,11850
179
179
  letta/server/rest_api/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
180
180
  letta/server/rest_api/auth/index.py,sha256=fQBGyVylGSRfEMLQ17cZzrHd5Y1xiVylvPqH5Rl-lXQ,1378
181
181
  letta/server/rest_api/auth_token.py,sha256=725EFEIiNj4dh70hrSd94UysmFD8vcJLrTRfNHkzxDo,774
182
- letta/server/rest_api/interface.py,sha256=XDEjDvuxfBbPpmhNnZk-Zd2eKAh1JgaaRkheEXH0VB4,45597
182
+ letta/server/rest_api/interface.py,sha256=1p8Bt7uLNLJsKa-TnLXobiLfO91laclK-AiE-jbJr18,51494
183
183
  letta/server/rest_api/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
184
184
  letta/server/rest_api/routers/openai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
185
185
  letta/server/rest_api/routers/openai/assistants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -203,7 +203,7 @@ letta/server/rest_api/routers/v1/tools.py,sha256=rGw3hDUFYmY_kmJw5hsQWnBOWQqJFdf
203
203
  letta/server/rest_api/routers/v1/users.py,sha256=EBQe9IfCG3kzHpKmotz4yVGZioXz3SCSRy5yEhJK8hU,2293
204
204
  letta/server/rest_api/static_files.py,sha256=NG8sN4Z5EJ8JVQdj19tkFa9iQ1kBPTab9f_CUxd_u4Q,3143
205
205
  letta/server/rest_api/utils.py,sha256=dsjkZzgo9Rk3fjUf1ajjiiql1eeO5DAzmXprttI7bJU,3993
206
- letta/server/server.py,sha256=fhgtAieokRiX9aS18n_6FgPJOzJoFpLGNXRRyjz6bc8,57054
206
+ letta/server/server.py,sha256=_Ubvl4CVQAh4BBKNzCnGHD47de2h6vuP2SvSnMZtA8U,57622
207
207
  letta/server/startup.sh,sha256=722uKJWB2C4q3vjn39De2zzPacaZNw_1fN1SpLGjKIo,1569
208
208
  letta/server/static_files/assets/index-048c9598.js,sha256=mR16XppvselwKCcNgONs4L7kZEVa4OEERm4lNZYtLSk,146819
209
209
  letta/server/static_files/assets/index-0e31b727.css,sha256=SBbja96uiQVLDhDOroHgM6NSl7tS4lpJRCREgSS_hA8,7672
@@ -234,11 +234,11 @@ letta/services/tool_manager.py,sha256=CdI6aYQZr2Ar9-iDSMnjMcLIh8n8y_gkKte6FnUy9u
234
234
  letta/services/user_manager.py,sha256=oqLF9C4mGbN0TaGj7wMpb2RH2bUg6OJJcdyaWv370rQ,4272
235
235
  letta/settings.py,sha256=LJAMa0APYBPn9oFtpAGotH10drrzaoFGL88RFoc8QTI,4733
236
236
  letta/streaming_interface.py,sha256=lo2VAQRUJOdWTijwnXuKOC9uejqr2siUAEmZiQUXkj8,15710
237
- letta/streaming_utils.py,sha256=329fsvj1ZN0r0LpQtmMPZ2vSxkDBIUUwvGHZFkjm2I8,11745
237
+ letta/streaming_utils.py,sha256=pJExJe6OgWDyRgzxbsSuT5JrVsXNlZP4hrT4Xu_z3Po,11778
238
238
  letta/system.py,sha256=buKYPqG5n2x41hVmWpu6JUpyd7vTWED9Km2_M7dLrvk,6960
239
239
  letta/utils.py,sha256=FQgWuYF0CTCIyH41rVy_rD5_ATPIlBZ24ovBtf3T1tI,33291
240
- letta_nightly-0.6.11.dev20250120212046.dist-info/LICENSE,sha256=mExtuZ_GYJgDEI38GWdiEYZizZS4KkVt2SF1g_GPNhI,10759
241
- letta_nightly-0.6.11.dev20250120212046.dist-info/METADATA,sha256=Z21zU_CpTlyI4NA1xkzTaSJLfRn7P2gMWF45VYhB1pY,21836
242
- letta_nightly-0.6.11.dev20250120212046.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
243
- letta_nightly-0.6.11.dev20250120212046.dist-info/entry_points.txt,sha256=2zdiyGNEZGV5oYBuS-y2nAAgjDgcC9yM_mHJBFSRt5U,40
244
- letta_nightly-0.6.11.dev20250120212046.dist-info/RECORD,,
240
+ letta_nightly-0.6.12.dev20250120222244.dist-info/LICENSE,sha256=mExtuZ_GYJgDEI38GWdiEYZizZS4KkVt2SF1g_GPNhI,10759
241
+ letta_nightly-0.6.12.dev20250120222244.dist-info/METADATA,sha256=TCGBysenArOWc2TOkQ7PkfQnCd5v6NCM0MetiKt1-Jw,21836
242
+ letta_nightly-0.6.12.dev20250120222244.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
243
+ letta_nightly-0.6.12.dev20250120222244.dist-info/entry_points.txt,sha256=2zdiyGNEZGV5oYBuS-y2nAAgjDgcC9yM_mHJBFSRt5U,40
244
+ letta_nightly-0.6.12.dev20250120222244.dist-info/RECORD,,