letta-nightly 0.5.1.dev20241031104107__py3-none-any.whl → 0.5.1.dev20241101104122__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/client/client.py +13 -8
- letta/orm/__init__.py +4 -0
- letta/schemas/agent.py +1 -1
- letta/schemas/letta_response.py +2 -2
- letta/server/rest_api/app.py +6 -0
- letta/server/rest_api/routers/v1/agents.py +16 -3
- letta/server/server.py +5 -5
- letta/server/startup.sh +3 -0
- letta/server/static_files/assets/{index-b82c8d7c.js → index-9fa459a2.js} +66 -69
- letta/server/static_files/index.html +1 -1
- {letta_nightly-0.5.1.dev20241031104107.dist-info → letta_nightly-0.5.1.dev20241101104122.dist-info}/METADATA +1 -1
- {letta_nightly-0.5.1.dev20241031104107.dist-info → letta_nightly-0.5.1.dev20241101104122.dist-info}/RECORD +15 -15
- {letta_nightly-0.5.1.dev20241031104107.dist-info → letta_nightly-0.5.1.dev20241101104122.dist-info}/LICENSE +0 -0
- {letta_nightly-0.5.1.dev20241031104107.dist-info → letta_nightly-0.5.1.dev20241101104122.dist-info}/WHEEL +0 -0
- {letta_nightly-0.5.1.dev20241031104107.dist-info → letta_nightly-0.5.1.dev20241101104122.dist-info}/entry_points.txt +0 -0
letta/client/client.py
CHANGED
|
@@ -791,7 +791,7 @@ class RESTClient(AbstractClient):
|
|
|
791
791
|
name: Optional[str] = None,
|
|
792
792
|
stream_steps: bool = False,
|
|
793
793
|
stream_tokens: bool = False,
|
|
794
|
-
include_full_message:
|
|
794
|
+
include_full_message: bool = False,
|
|
795
795
|
) -> Union[LettaResponse, Generator[LettaStreamingResponse, None, None]]:
|
|
796
796
|
"""
|
|
797
797
|
Send a message to an agent
|
|
@@ -812,7 +812,12 @@ class RESTClient(AbstractClient):
|
|
|
812
812
|
# TODO: figure out how to handle stream_steps and stream_tokens
|
|
813
813
|
|
|
814
814
|
# When streaming steps is True, stream_tokens must be False
|
|
815
|
-
request = LettaRequest(
|
|
815
|
+
request = LettaRequest(
|
|
816
|
+
messages=messages,
|
|
817
|
+
stream_steps=stream_steps,
|
|
818
|
+
stream_tokens=stream_tokens,
|
|
819
|
+
return_message_object=include_full_message,
|
|
820
|
+
)
|
|
816
821
|
if stream_tokens or stream_steps:
|
|
817
822
|
from letta.client.streaming import _sse_post
|
|
818
823
|
|
|
@@ -827,12 +832,12 @@ class RESTClient(AbstractClient):
|
|
|
827
832
|
response = LettaResponse(**response.json())
|
|
828
833
|
|
|
829
834
|
# simplify messages
|
|
830
|
-
if not include_full_message:
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
835
|
+
# if not include_full_message:
|
|
836
|
+
# messages = []
|
|
837
|
+
# for m in response.messages:
|
|
838
|
+
# assert isinstance(m, Message)
|
|
839
|
+
# messages += m.to_letta_message()
|
|
840
|
+
# response.messages = messages
|
|
836
841
|
|
|
837
842
|
return response
|
|
838
843
|
|
letta/orm/__init__.py
CHANGED
letta/schemas/agent.py
CHANGED
|
@@ -63,7 +63,7 @@ class AgentState(BaseAgent, validate_assignment=True):
|
|
|
63
63
|
tools: List[str] = Field(..., description="The tools used by the agent.")
|
|
64
64
|
|
|
65
65
|
# tool rules
|
|
66
|
-
tool_rules: List[BaseToolRule] = Field(
|
|
66
|
+
tool_rules: Optional[List[BaseToolRule]] = Field(default=None, description="The list of tool rules.")
|
|
67
67
|
|
|
68
68
|
# system prompt
|
|
69
69
|
system: str = Field(..., description="The system prompt used by the agent.")
|
letta/schemas/letta_response.py
CHANGED
|
@@ -3,7 +3,7 @@ from typing import List, Union
|
|
|
3
3
|
from pydantic import BaseModel, Field
|
|
4
4
|
|
|
5
5
|
from letta.schemas.enums import MessageStreamStatus
|
|
6
|
-
from letta.schemas.letta_message import LettaMessage
|
|
6
|
+
from letta.schemas.letta_message import LettaMessage, LettaMessageUnion
|
|
7
7
|
from letta.schemas.message import Message
|
|
8
8
|
from letta.schemas.usage import LettaUsageStatistics
|
|
9
9
|
from letta.utils import json_dumps
|
|
@@ -21,7 +21,7 @@ class LettaResponse(BaseModel):
|
|
|
21
21
|
usage (LettaUsageStatistics): The usage statistics
|
|
22
22
|
"""
|
|
23
23
|
|
|
24
|
-
messages: Union[List[Message], List[
|
|
24
|
+
messages: Union[List[Message], List[LettaMessageUnion]] = Field(..., description="The messages returned by the agent.")
|
|
25
25
|
usage: LettaUsageStatistics = Field(..., description="The usage statistics of the agent.")
|
|
26
26
|
|
|
27
27
|
def __str__(self):
|
letta/server/rest_api/app.py
CHANGED
|
@@ -54,6 +54,12 @@ password = None
|
|
|
54
54
|
# password = secrets.token_urlsafe(16)
|
|
55
55
|
# #typer.secho(f"Generated admin server password for this session: {password}", fg=typer.colors.GREEN)
|
|
56
56
|
|
|
57
|
+
import logging
|
|
58
|
+
|
|
59
|
+
from fastapi import FastAPI
|
|
60
|
+
|
|
61
|
+
log = logging.getLogger("uvicorn")
|
|
62
|
+
|
|
57
63
|
|
|
58
64
|
def create_application() -> "FastAPI":
|
|
59
65
|
"""the application start routine"""
|
|
@@ -4,7 +4,6 @@ from typing import Dict, List, Optional, Union
|
|
|
4
4
|
|
|
5
5
|
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, status
|
|
6
6
|
from fastapi.responses import JSONResponse, StreamingResponse
|
|
7
|
-
from starlette.responses import StreamingResponse
|
|
8
7
|
|
|
9
8
|
from letta.constants import DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG
|
|
10
9
|
from letta.schemas.agent import AgentState, CreateAgent, UpdateAgentState
|
|
@@ -359,7 +358,20 @@ def update_message(
|
|
|
359
358
|
return server.update_agent_message(agent_id=agent_id, request=request)
|
|
360
359
|
|
|
361
360
|
|
|
362
|
-
@router.post(
|
|
361
|
+
@router.post(
|
|
362
|
+
"/{agent_id}/messages",
|
|
363
|
+
response_model=None,
|
|
364
|
+
operation_id="create_agent_message",
|
|
365
|
+
responses={
|
|
366
|
+
200: {
|
|
367
|
+
"description": "Successful response",
|
|
368
|
+
"content": {
|
|
369
|
+
"application/json": {"schema": LettaResponse.model_json_schema()}, # Use model_json_schema() instead of model directly
|
|
370
|
+
"text/event-stream": {"description": "Server-Sent Events stream"},
|
|
371
|
+
},
|
|
372
|
+
}
|
|
373
|
+
},
|
|
374
|
+
)
|
|
363
375
|
async def send_message(
|
|
364
376
|
agent_id: str,
|
|
365
377
|
server: SyncServer = Depends(get_letta_server),
|
|
@@ -373,7 +385,7 @@ async def send_message(
|
|
|
373
385
|
"""
|
|
374
386
|
actor = server.get_user_or_default(user_id=user_id)
|
|
375
387
|
|
|
376
|
-
|
|
388
|
+
result = await send_message_to_agent(
|
|
377
389
|
server=server,
|
|
378
390
|
agent_id=agent_id,
|
|
379
391
|
user_id=actor.id,
|
|
@@ -386,6 +398,7 @@ async def send_message(
|
|
|
386
398
|
assistant_message_function_name=request.assistant_message_function_name,
|
|
387
399
|
assistant_message_function_kwarg=request.assistant_message_function_kwarg,
|
|
388
400
|
)
|
|
401
|
+
return result
|
|
389
402
|
|
|
390
403
|
|
|
391
404
|
# TODO: move this into server.py?
|
letta/server/server.py
CHANGED
|
@@ -35,8 +35,9 @@ from letta.interface import AgentInterface # abstract
|
|
|
35
35
|
from letta.interface import CLIInterface # for printing to terminal
|
|
36
36
|
from letta.log import get_logger
|
|
37
37
|
from letta.memory import get_memory_functions
|
|
38
|
-
from letta.metadata import
|
|
38
|
+
from letta.metadata import MetadataStore
|
|
39
39
|
from letta.o1_agent import O1Agent
|
|
40
|
+
from letta.orm import Base
|
|
40
41
|
from letta.orm.errors import NoResultFound
|
|
41
42
|
from letta.prompts import gpt_system
|
|
42
43
|
from letta.providers import (
|
|
@@ -169,6 +170,8 @@ from letta.settings import model_settings, settings, tool_settings
|
|
|
169
170
|
|
|
170
171
|
config = LettaConfig.load()
|
|
171
172
|
|
|
173
|
+
attach_base()
|
|
174
|
+
|
|
172
175
|
if settings.letta_pg_uri_no_default:
|
|
173
176
|
config.recall_storage_type = "postgres"
|
|
174
177
|
config.recall_storage_uri = settings.letta_pg_uri_no_default
|
|
@@ -181,13 +184,10 @@ else:
|
|
|
181
184
|
# TODO: don't rely on config storage
|
|
182
185
|
engine = create_engine("sqlite:///" + os.path.join(config.recall_storage_path, "sqlite.db"))
|
|
183
186
|
|
|
187
|
+
Base.metadata.create_all(bind=engine)
|
|
184
188
|
|
|
185
189
|
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
|
186
190
|
|
|
187
|
-
attach_base()
|
|
188
|
-
|
|
189
|
-
Base.metadata.create_all(bind=engine)
|
|
190
|
-
|
|
191
191
|
|
|
192
192
|
# Dependency
|
|
193
193
|
def get_db():
|
letta/server/startup.sh
CHANGED