letta-nightly 0.5.1.dev20241029104141__py3-none-any.whl → 0.5.1.dev20241030104135__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.

@@ -359,7 +359,7 @@ def update_message(
359
359
  return server.update_agent_message(agent_id=agent_id, request=request)
360
360
 
361
361
 
362
- @router.post("/{agent_id}/messages", response_model=LettaResponse, operation_id="create_agent_message")
362
+ @router.post("/{agent_id}/messages", response_model=None, operation_id="create_agent_message")
363
363
  async def send_message(
364
364
  agent_id: str,
365
365
  server: SyncServer = Depends(get_letta_server),
@@ -373,16 +373,10 @@ async def send_message(
373
373
  """
374
374
  actor = server.get_user_or_default(user_id=user_id)
375
375
 
376
- # TODO(charles): support sending multiple messages
377
- assert len(request.messages) == 1, f"Multiple messages not supported: {request.messages}"
378
- request.messages[0]
379
-
380
376
  return await send_message_to_agent(
381
377
  server=server,
382
378
  agent_id=agent_id,
383
379
  user_id=actor.id,
384
- # role=message.role,
385
- # message=message.text,
386
380
  messages=request.messages,
387
381
  stream_steps=request.stream_steps,
388
382
  stream_tokens=request.stream_tokens,
@@ -463,8 +457,12 @@ async def send_message_to_agent(
463
457
  # Offload the synchronous message_func to a separate thread
464
458
  streaming_interface.stream_start()
465
459
  task = asyncio.create_task(
466
- # asyncio.to_thread(message_func, user_id=user_id, agent_id=agent_id, message=message, timestamp=timestamp)
467
- asyncio.to_thread(server.send_messages, user_id=user_id, agent_id=agent_id, messages=messages)
460
+ asyncio.to_thread(
461
+ server.send_messages,
462
+ user_id=user_id,
463
+ agent_id=agent_id,
464
+ messages=messages,
465
+ )
468
466
  )
469
467
 
470
468
  if stream_steps:
@@ -474,7 +472,11 @@ async def send_message_to_agent(
474
472
 
475
473
  # return a stream
476
474
  return StreamingResponse(
477
- sse_async_generator(streaming_interface.get_generator(), finish_message=include_final_message),
475
+ sse_async_generator(
476
+ streaming_interface.get_generator(),
477
+ usage_task=task,
478
+ finish_message=include_final_message,
479
+ ),
478
480
  media_type="text/event-stream",
479
481
  )
480
482
 
@@ -1,10 +1,13 @@
1
+ import asyncio
1
2
  import json
2
3
  import traceback
4
+ import warnings
3
5
  from enum import Enum
4
- from typing import AsyncGenerator, Union
6
+ from typing import AsyncGenerator, Optional, Union
5
7
 
6
8
  from pydantic import BaseModel
7
9
 
10
+ from letta.schemas.usage import LettaUsageStatistics
8
11
  from letta.server.rest_api.interface import StreamingServerInterface
9
12
  from letta.server.server import SyncServer
10
13
 
@@ -24,7 +27,11 @@ def sse_formatter(data: Union[dict, str]) -> str:
24
27
  return f"data: {data_str}\n\n"
25
28
 
26
29
 
27
- async def sse_async_generator(generator: AsyncGenerator, finish_message=True):
30
+ async def sse_async_generator(
31
+ generator: AsyncGenerator,
32
+ usage_task: Optional[asyncio.Task] = None,
33
+ finish_message=True,
34
+ ):
28
35
  """
29
36
  Wraps a generator for use in Server-Sent Events (SSE), handling errors and ensuring a completion message.
30
37
 
@@ -45,6 +52,18 @@ async def sse_async_generator(generator: AsyncGenerator, finish_message=True):
45
52
  chunk = str(chunk)
46
53
  yield sse_formatter(chunk)
47
54
 
55
+ # If we have a usage task, wait for it and send its result
56
+ if usage_task is not None:
57
+ try:
58
+ usage = await usage_task
59
+ # Double-check the type
60
+ if not isinstance(usage, LettaUsageStatistics):
61
+ raise ValueError(f"Expected LettaUsageStatistics, got {type(usage)}")
62
+ yield sse_formatter({"usage": usage.model_dump()})
63
+ except Exception as e:
64
+ warnings.warn(f"Error getting usage data: {e}")
65
+ yield sse_formatter({"error": "Failed to get usage data"})
66
+
48
67
  except Exception as e:
49
68
  print("stream decoder hit error:", e)
50
69
  print(traceback.print_stack())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: letta-nightly
3
- Version: 0.5.1.dev20241029104141
3
+ Version: 0.5.1.dev20241030104135
4
4
  Summary: Create LLM agents with long-term memory and custom tools
5
5
  License: Apache License
6
6
  Author: Letta Team
@@ -169,7 +169,7 @@ letta/server/rest_api/routers/openai/assistants/threads.py,sha256=WXVGBaBvSNPB7Z
169
169
  letta/server/rest_api/routers/openai/chat_completions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
170
170
  letta/server/rest_api/routers/openai/chat_completions/chat_completions.py,sha256=-uye6cm4SnoQGwxhr1N1FrSXOlnO2Hvbfj6k8JSc45k,4918
171
171
  letta/server/rest_api/routers/v1/__init__.py,sha256=sqlVZa-u9DJwdRsp0_8YUGrac9DHguIB4wETlEDRylA,666
172
- letta/server/rest_api/routers/v1/agents.py,sha256=EoUWyhiWYYxhtwZUg9agyDeCpixLqzsP9YXIk_zX7MM,25355
172
+ letta/server/rest_api/routers/v1/agents.py,sha256=Ph3J90KKuUVXL1MotJFTtSg9_s9f2GkgbiAbJyj00V8,25166
173
173
  letta/server/rest_api/routers/v1/blocks.py,sha256=0WekE_yBD2U3jYgPxI0DCFjACWavCAlvm_Ybw5SZBnw,2583
174
174
  letta/server/rest_api/routers/v1/health.py,sha256=pKCuVESlVOhGIb4VC4K-H82eZqfghmT6kvj2iOkkKuc,401
175
175
  letta/server/rest_api/routers/v1/jobs.py,sha256=a-j0v-5A0un0pVCOHpfeWnzpOWkVDQO6ti42k_qAlZY,2272
@@ -179,7 +179,7 @@ letta/server/rest_api/routers/v1/sources.py,sha256=eY_pk9jRL2Y9yIZdsTjH6EuKsfH1n
179
179
  letta/server/rest_api/routers/v1/tools.py,sha256=aVZcVxL68Oq8N6p3p_MsGrNxmnK3-UWAIHdVztFw_Nk,3794
180
180
  letta/server/rest_api/routers/v1/users.py,sha256=bxQ-YdevjDqmgNDfbSPAG_4KEVvPNBHD_-Lp1MdeMec,3374
181
181
  letta/server/rest_api/static_files.py,sha256=NG8sN4Z5EJ8JVQdj19tkFa9iQ1kBPTab9f_CUxd_u4Q,3143
182
- letta/server/rest_api/utils.py,sha256=Fc2ZGKzLaBa2sEtSTVjJ8D5M0xIwsWC0CVAOIJaD3rY,2176
182
+ letta/server/rest_api/utils.py,sha256=GdHYCzXtbM5VCAYDPR0z5gnNZpRhwPld2BGZV7xT6cU,2924
183
183
  letta/server/server.py,sha256=HeIucHAaf6CpV0izHTnrMfQwDX-Lbs7j9DHYogZpLAc,80255
184
184
  letta/server/startup.sh,sha256=o2dY9wc5Ew1j_10U6dK2FYevAj79udZ-T969j5rG-a0,311
185
185
  letta/server/static_files/assets/index-3ab03d5b.css,sha256=OrA9W4iKJ5h2Wlr7GwdAT4wow0CM8hVit1yOxEL49Qw,54295
@@ -202,8 +202,8 @@ letta/streaming_interface.py,sha256=_FPUWy58j50evHcpXyd7zB1wWqeCc71NCFeWh_TBvnw,
202
202
  letta/streaming_utils.py,sha256=329fsvj1ZN0r0LpQtmMPZ2vSxkDBIUUwvGHZFkjm2I8,11745
203
203
  letta/system.py,sha256=buKYPqG5n2x41hVmWpu6JUpyd7vTWED9Km2_M7dLrvk,6960
204
204
  letta/utils.py,sha256=SXLEYhyp3gHyIjrxNIKNZZ5ittKo3KOj6zxgC_Trex0,31012
205
- letta_nightly-0.5.1.dev20241029104141.dist-info/LICENSE,sha256=mExtuZ_GYJgDEI38GWdiEYZizZS4KkVt2SF1g_GPNhI,10759
206
- letta_nightly-0.5.1.dev20241029104141.dist-info/METADATA,sha256=_xR7OpWIFvzC-jEsKBRLUsZ1cXbNOYvxH1ZlSB2U9EY,10660
207
- letta_nightly-0.5.1.dev20241029104141.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
208
- letta_nightly-0.5.1.dev20241029104141.dist-info/entry_points.txt,sha256=2zdiyGNEZGV5oYBuS-y2nAAgjDgcC9yM_mHJBFSRt5U,40
209
- letta_nightly-0.5.1.dev20241029104141.dist-info/RECORD,,
205
+ letta_nightly-0.5.1.dev20241030104135.dist-info/LICENSE,sha256=mExtuZ_GYJgDEI38GWdiEYZizZS4KkVt2SF1g_GPNhI,10759
206
+ letta_nightly-0.5.1.dev20241030104135.dist-info/METADATA,sha256=uGyx0kl-8ZxebvCtXGM5Ko0oQNo_hmgRGzuiO0DnPMc,10660
207
+ letta_nightly-0.5.1.dev20241030104135.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
208
+ letta_nightly-0.5.1.dev20241030104135.dist-info/entry_points.txt,sha256=2zdiyGNEZGV5oYBuS-y2nAAgjDgcC9yM_mHJBFSRt5U,40
209
+ letta_nightly-0.5.1.dev20241030104135.dist-info/RECORD,,