letta-nightly 0.5.1.dev20241024104118__py3-none-any.whl → 0.5.1.dev20241026104101__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/agent.py +1 -6
- letta/cli/cli.py +6 -4
- letta/client/client.py +75 -92
- letta/config.py +0 -6
- letta/constants.py +0 -9
- letta/functions/functions.py +24 -0
- letta/functions/helpers.py +4 -3
- letta/functions/schema_generator.py +10 -2
- letta/metadata.py +2 -99
- letta/o1_agent.py +2 -2
- letta/orm/__all__.py +15 -0
- letta/orm/mixins.py +16 -1
- letta/orm/organization.py +2 -0
- letta/orm/sqlalchemy_base.py +17 -18
- letta/orm/tool.py +54 -0
- letta/orm/user.py +7 -1
- letta/schemas/block.py +6 -9
- letta/schemas/memory.py +27 -29
- letta/schemas/tool.py +62 -61
- letta/schemas/user.py +2 -2
- letta/server/rest_api/admin/users.py +1 -1
- letta/server/rest_api/routers/v1/tools.py +19 -23
- letta/server/server.py +42 -327
- letta/services/organization_manager.py +19 -12
- letta/services/tool_manager.py +193 -0
- letta/services/user_manager.py +16 -11
- {letta_nightly-0.5.1.dev20241024104118.dist-info → letta_nightly-0.5.1.dev20241026104101.dist-info}/METADATA +1 -1
- {letta_nightly-0.5.1.dev20241024104118.dist-info → letta_nightly-0.5.1.dev20241026104101.dist-info}/RECORD +31 -29
- {letta_nightly-0.5.1.dev20241024104118.dist-info → letta_nightly-0.5.1.dev20241026104101.dist-info}/LICENSE +0 -0
- {letta_nightly-0.5.1.dev20241024104118.dist-info → letta_nightly-0.5.1.dev20241026104101.dist-info}/WHEEL +0 -0
- {letta_nightly-0.5.1.dev20241024104118.dist-info → letta_nightly-0.5.1.dev20241026104101.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import importlib
|
|
2
|
+
import inspect
|
|
3
|
+
import warnings
|
|
4
|
+
from typing import List, Optional
|
|
5
|
+
|
|
6
|
+
from letta.functions.functions import derive_openai_json_schema, load_function_set
|
|
7
|
+
|
|
8
|
+
# TODO: Remove this once we translate all of these to the ORM
|
|
9
|
+
from letta.orm.errors import NoResultFound
|
|
10
|
+
from letta.orm.organization import Organization as OrganizationModel
|
|
11
|
+
from letta.orm.tool import Tool as ToolModel
|
|
12
|
+
from letta.orm.user import User as UserModel
|
|
13
|
+
from letta.schemas.tool import Tool as PydanticTool
|
|
14
|
+
from letta.schemas.tool import ToolCreate, ToolUpdate
|
|
15
|
+
from letta.utils import enforce_types
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ToolManager:
|
|
19
|
+
"""Manager class to handle business logic related to Tools."""
|
|
20
|
+
|
|
21
|
+
def __init__(self):
|
|
22
|
+
# Fetching the db_context similarly as in OrganizationManager
|
|
23
|
+
from letta.server.server import db_context
|
|
24
|
+
|
|
25
|
+
self.session_maker = db_context
|
|
26
|
+
|
|
27
|
+
@enforce_types
|
|
28
|
+
def create_or_update_tool(self, tool_create: ToolCreate) -> PydanticTool:
|
|
29
|
+
"""Create a new tool based on the ToolCreate schema."""
|
|
30
|
+
# Derive json_schema
|
|
31
|
+
derived_json_schema = tool_create.json_schema or derive_openai_json_schema(tool_create)
|
|
32
|
+
derived_name = tool_create.name or derived_json_schema["name"]
|
|
33
|
+
|
|
34
|
+
try:
|
|
35
|
+
# NOTE: We use the organization id here
|
|
36
|
+
# This is important, because even if it's a different user, adding the same tool to the org should not happen
|
|
37
|
+
tool = self.get_tool_by_name_and_org_id(tool_name=derived_name, organization_id=tool_create.organization_id)
|
|
38
|
+
# Put to dict and remove fields that should not be reset
|
|
39
|
+
update_data = tool_create.model_dump(exclude={"user_id", "organization_id", "module", "terminal"}, exclude_unset=True)
|
|
40
|
+
# Remove redundant update fields
|
|
41
|
+
update_data = {key: value for key, value in update_data.items() if getattr(tool, key) != value}
|
|
42
|
+
|
|
43
|
+
# If there's anything to update
|
|
44
|
+
if update_data:
|
|
45
|
+
self.update_tool_by_id(tool.id, ToolUpdate(**update_data))
|
|
46
|
+
else:
|
|
47
|
+
warnings.warn(
|
|
48
|
+
f"`create_or_update_tool` was called with user_id={tool_create.user_id}, organization_id={tool_create.organization_id}, name={tool_create.name}, but found existing tool with nothing to update."
|
|
49
|
+
)
|
|
50
|
+
except NoResultFound:
|
|
51
|
+
tool_create.json_schema = derived_json_schema
|
|
52
|
+
tool_create.name = derived_name
|
|
53
|
+
tool = self.create_tool(tool_create)
|
|
54
|
+
|
|
55
|
+
return tool
|
|
56
|
+
|
|
57
|
+
@enforce_types
|
|
58
|
+
def create_tool(self, tool_create: ToolCreate) -> PydanticTool:
|
|
59
|
+
"""Create a new tool based on the ToolCreate schema."""
|
|
60
|
+
# Create the tool
|
|
61
|
+
with self.session_maker() as session:
|
|
62
|
+
# Include all fields except 'terminal' (which is not part of ToolModel) at the moment
|
|
63
|
+
create_data = tool_create.model_dump(exclude={"terminal"})
|
|
64
|
+
tool = ToolModel(**create_data) # Unpack everything directly into ToolModel
|
|
65
|
+
tool.create(session)
|
|
66
|
+
|
|
67
|
+
return tool.to_pydantic()
|
|
68
|
+
|
|
69
|
+
@enforce_types
|
|
70
|
+
def get_tool_by_id(self, tool_id: str) -> PydanticTool:
|
|
71
|
+
"""Fetch a tool by its ID."""
|
|
72
|
+
with self.session_maker() as session:
|
|
73
|
+
try:
|
|
74
|
+
# Retrieve tool by id using the Tool model's read method
|
|
75
|
+
tool = ToolModel.read(db_session=session, identifier=tool_id)
|
|
76
|
+
# Convert the SQLAlchemy Tool object to PydanticTool
|
|
77
|
+
return tool.to_pydantic()
|
|
78
|
+
except NoResultFound:
|
|
79
|
+
raise ValueError(f"Tool with id {tool_id} not found.")
|
|
80
|
+
|
|
81
|
+
@enforce_types
|
|
82
|
+
def get_tool_by_name_and_user_id(self, tool_name: str, user_id: str) -> PydanticTool:
|
|
83
|
+
"""Retrieve a tool by its name and organization_id."""
|
|
84
|
+
with self.session_maker() as session:
|
|
85
|
+
# Use the list method to apply filters
|
|
86
|
+
results = ToolModel.list(db_session=session, name=tool_name, _user_id=UserModel.get_uid_from_identifier(user_id))
|
|
87
|
+
|
|
88
|
+
# Ensure only one result is returned (since there is a unique constraint)
|
|
89
|
+
if not results:
|
|
90
|
+
raise NoResultFound(f"Tool with name {tool_name} and user_id {user_id} not found.")
|
|
91
|
+
|
|
92
|
+
if len(results) > 1:
|
|
93
|
+
raise RuntimeError(
|
|
94
|
+
f"Multiple tools with name {tool_name} and user_id {user_id} were found. This is a serious error, and means that our table does not have uniqueness constraints properly set up. Please reach out to the letta development team if you see this error."
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
# Return the single result
|
|
98
|
+
return results[0]
|
|
99
|
+
|
|
100
|
+
@enforce_types
|
|
101
|
+
def get_tool_by_name_and_org_id(self, tool_name: str, organization_id: str) -> PydanticTool:
|
|
102
|
+
"""Retrieve a tool by its name and organization_id."""
|
|
103
|
+
with self.session_maker() as session:
|
|
104
|
+
# Use the list method to apply filters
|
|
105
|
+
results = ToolModel.list(
|
|
106
|
+
db_session=session, name=tool_name, _organization_id=OrganizationModel.get_uid_from_identifier(organization_id)
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
# Ensure only one result is returned (since there is a unique constraint)
|
|
110
|
+
if not results:
|
|
111
|
+
raise NoResultFound(f"Tool with name {tool_name} and organization_id {organization_id} not found.")
|
|
112
|
+
|
|
113
|
+
if len(results) > 1:
|
|
114
|
+
raise RuntimeError(
|
|
115
|
+
f"Multiple tools with name {tool_name} and organization_id {organization_id} were found. This is a serious error, and means that our table does not have uniqueness constraints properly set up. Please reach out to the letta development team if you see this error."
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
# Return the single result
|
|
119
|
+
return results[0]
|
|
120
|
+
|
|
121
|
+
@enforce_types
|
|
122
|
+
def list_tools_for_org(self, organization_id: str, cursor: Optional[str] = None, limit: Optional[int] = 50) -> List[PydanticTool]:
|
|
123
|
+
"""List all tools with optional pagination using cursor and limit."""
|
|
124
|
+
with self.session_maker() as session:
|
|
125
|
+
tools = ToolModel.list(
|
|
126
|
+
db_session=session, cursor=cursor, limit=limit, _organization_id=OrganizationModel.get_uid_from_identifier(organization_id)
|
|
127
|
+
)
|
|
128
|
+
return [tool.to_pydantic() for tool in tools]
|
|
129
|
+
|
|
130
|
+
@enforce_types
|
|
131
|
+
def update_tool_by_id(self, tool_id: str, tool_update: ToolUpdate) -> None:
|
|
132
|
+
"""Update a tool by its ID with the given ToolUpdate object."""
|
|
133
|
+
with self.session_maker() as session:
|
|
134
|
+
# Fetch the tool by ID
|
|
135
|
+
tool = ToolModel.read(db_session=session, identifier=tool_id)
|
|
136
|
+
|
|
137
|
+
# Update tool attributes with only the fields that were explicitly set
|
|
138
|
+
update_data = tool_update.model_dump(exclude_unset=True, exclude_none=True)
|
|
139
|
+
for key, value in update_data.items():
|
|
140
|
+
setattr(tool, key, value)
|
|
141
|
+
|
|
142
|
+
# Save the updated tool to the database
|
|
143
|
+
tool.update(db_session=session)
|
|
144
|
+
|
|
145
|
+
@enforce_types
|
|
146
|
+
def delete_tool_by_id(self, tool_id: str) -> None:
|
|
147
|
+
"""Delete a tool by its ID."""
|
|
148
|
+
with self.session_maker() as session:
|
|
149
|
+
try:
|
|
150
|
+
tool = ToolModel.read(db_session=session, identifier=tool_id)
|
|
151
|
+
tool.delete(db_session=session)
|
|
152
|
+
except NoResultFound:
|
|
153
|
+
raise ValueError(f"Tool with id {tool_id} not found.")
|
|
154
|
+
|
|
155
|
+
@enforce_types
|
|
156
|
+
def add_default_tools(self, user_id: str, org_id: str, module_name="base"):
|
|
157
|
+
"""Add default tools in {module_name}.py"""
|
|
158
|
+
full_module_name = f"letta.functions.function_sets.{module_name}"
|
|
159
|
+
try:
|
|
160
|
+
module = importlib.import_module(full_module_name)
|
|
161
|
+
except Exception as e:
|
|
162
|
+
# Handle other general exceptions
|
|
163
|
+
raise e
|
|
164
|
+
|
|
165
|
+
functions_to_schema = []
|
|
166
|
+
try:
|
|
167
|
+
# Load the function set
|
|
168
|
+
functions_to_schema = load_function_set(module)
|
|
169
|
+
except ValueError as e:
|
|
170
|
+
err = f"Error loading function set '{module_name}': {e}"
|
|
171
|
+
warnings.warn(err)
|
|
172
|
+
|
|
173
|
+
# create tool in db
|
|
174
|
+
for name, schema in functions_to_schema.items():
|
|
175
|
+
# print([str(inspect.getsource(line)) for line in schema["imports"]])
|
|
176
|
+
source_code = inspect.getsource(schema["python_function"])
|
|
177
|
+
tags = [module_name]
|
|
178
|
+
if module_name == "base":
|
|
179
|
+
tags.append("letta-base")
|
|
180
|
+
|
|
181
|
+
# create to tool
|
|
182
|
+
self.create_or_update_tool(
|
|
183
|
+
ToolCreate(
|
|
184
|
+
name=name,
|
|
185
|
+
tags=tags,
|
|
186
|
+
source_type="python",
|
|
187
|
+
module=schema["module"],
|
|
188
|
+
source_code=source_code,
|
|
189
|
+
json_schema=schema["json_schema"],
|
|
190
|
+
organization_id=org_id,
|
|
191
|
+
user_id=user_id,
|
|
192
|
+
),
|
|
193
|
+
)
|
letta/services/user_manager.py
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
from typing import List, Optional, Tuple
|
|
2
2
|
|
|
3
|
-
from letta.constants import DEFAULT_ORG_ID, DEFAULT_USER_ID, DEFAULT_USER_NAME
|
|
4
|
-
|
|
5
|
-
# TODO: Remove this once we translate all of these to the ORM
|
|
6
|
-
from letta.metadata import AgentModel, AgentSourceMappingModel, SourceModel
|
|
7
3
|
from letta.orm.errors import NoResultFound
|
|
8
4
|
from letta.orm.organization import Organization as OrganizationModel
|
|
9
5
|
from letta.orm.user import User as UserModel
|
|
10
6
|
from letta.schemas.user import User as PydanticUser
|
|
11
7
|
from letta.schemas.user import UserCreate, UserUpdate
|
|
8
|
+
from letta.services.organization_manager import OrganizationManager
|
|
12
9
|
from letta.utils import enforce_types
|
|
13
10
|
|
|
14
11
|
|
|
15
12
|
class UserManager:
|
|
16
13
|
"""Manager class to handle business logic related to Users."""
|
|
17
14
|
|
|
15
|
+
DEFAULT_USER_NAME = "default_user"
|
|
16
|
+
DEFAULT_USER_ID = "user-00000000-0000-4000-8000-000000000000"
|
|
17
|
+
|
|
18
18
|
def __init__(self):
|
|
19
19
|
# Fetching the db_context similarly as in OrganizationManager
|
|
20
20
|
from letta.server.server import db_context
|
|
@@ -22,7 +22,7 @@ class UserManager:
|
|
|
22
22
|
self.session_maker = db_context
|
|
23
23
|
|
|
24
24
|
@enforce_types
|
|
25
|
-
def create_default_user(self, org_id: str = DEFAULT_ORG_ID) -> PydanticUser:
|
|
25
|
+
def create_default_user(self, org_id: str = OrganizationManager.DEFAULT_ORG_ID) -> PydanticUser:
|
|
26
26
|
"""Create the default user."""
|
|
27
27
|
with self.session_maker() as session:
|
|
28
28
|
# Make sure the org id exists
|
|
@@ -33,10 +33,10 @@ class UserManager:
|
|
|
33
33
|
|
|
34
34
|
# Try to retrieve the user
|
|
35
35
|
try:
|
|
36
|
-
user = UserModel.read(db_session=session, identifier=DEFAULT_USER_ID)
|
|
36
|
+
user = UserModel.read(db_session=session, identifier=self.DEFAULT_USER_ID)
|
|
37
37
|
except NoResultFound:
|
|
38
38
|
# If it doesn't exist, make it
|
|
39
|
-
user = UserModel(id=DEFAULT_USER_ID, name=DEFAULT_USER_NAME, organization_id=org_id)
|
|
39
|
+
user = UserModel(id=self.DEFAULT_USER_ID, name=self.DEFAULT_USER_NAME, organization_id=org_id)
|
|
40
40
|
user.create(session)
|
|
41
41
|
|
|
42
42
|
return user.to_pydantic()
|
|
@@ -73,11 +73,11 @@ class UserManager:
|
|
|
73
73
|
user = UserModel.read(db_session=session, identifier=user_id)
|
|
74
74
|
user.delete(session)
|
|
75
75
|
|
|
76
|
-
# TODO:
|
|
76
|
+
# TODO: Integrate this via the ORM models for the Agent, Source, and AgentSourceMapping
|
|
77
77
|
# Cascade delete for related models: Agent, Source, AgentSourceMapping
|
|
78
|
-
session.query(AgentModel).filter(AgentModel.user_id == user_id).delete()
|
|
79
|
-
session.query(SourceModel).filter(SourceModel.user_id == user_id).delete()
|
|
80
|
-
session.query(AgentSourceMappingModel).filter(AgentSourceMappingModel.user_id == user_id).delete()
|
|
78
|
+
# session.query(AgentModel).filter(AgentModel.user_id == user_id).delete()
|
|
79
|
+
# session.query(SourceModel).filter(SourceModel.user_id == user_id).delete()
|
|
80
|
+
# session.query(AgentSourceMappingModel).filter(AgentSourceMappingModel.user_id == user_id).delete()
|
|
81
81
|
|
|
82
82
|
session.commit()
|
|
83
83
|
|
|
@@ -91,6 +91,11 @@ class UserManager:
|
|
|
91
91
|
except NoResultFound:
|
|
92
92
|
raise ValueError(f"User with id {user_id} not found.")
|
|
93
93
|
|
|
94
|
+
@enforce_types
|
|
95
|
+
def get_default_user(self) -> PydanticUser:
|
|
96
|
+
"""Fetch the default user."""
|
|
97
|
+
return self.get_user_by_id(self.DEFAULT_USER_ID)
|
|
98
|
+
|
|
94
99
|
@enforce_types
|
|
95
100
|
def list_users(self, cursor: Optional[str] = None, limit: Optional[int] = 50) -> Tuple[Optional[str], List[PydanticUser]]:
|
|
96
101
|
"""List users with pagination using cursor (id) and limit."""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
letta/__init__.py,sha256=zlZXKr0iQIsC7FTkN9fjTvAgQGPXyr0nnkMJ7_OE1D0,1014
|
|
2
2
|
letta/__main__.py,sha256=6Hs2PV7EYc5Tid4g4OtcLXhqVHiNYTGzSBdoOnW2HXA,29
|
|
3
|
-
letta/agent.py,sha256=
|
|
3
|
+
letta/agent.py,sha256=rU1XEgE-sIXGVq7oCSE1oeEJXezTIUGcPGCGYAbCJKY,72833
|
|
4
4
|
letta/agent_store/chroma.py,sha256=upR5zGnGs6I6btulEYbiZdGG87BgKjxUJOQZ4Y-RQ_M,12492
|
|
5
5
|
letta/agent_store/db.py,sha256=mTY3YWUs5n17479GMeTmxN8DAyzbBweVcypyNsK_slg,23435
|
|
6
6
|
letta/agent_store/lancedb.py,sha256=i63d4VZwj9UIOTNs5f0JZ_r5yZD-jKWz4FAH4RMpXOE,5104
|
|
@@ -9,15 +9,15 @@ letta/agent_store/qdrant.py,sha256=6_33V-FEDpT9LG5zmr6-3y9slw1YFLswxpahiyMkvHA,7
|
|
|
9
9
|
letta/agent_store/storage.py,sha256=4gKvMRYBGm9cwyaDOzljxDKgqr4MxGXcC4yGhAdKcAA,6693
|
|
10
10
|
letta/benchmark/benchmark.py,sha256=ebvnwfp3yezaXOQyGXkYCDYpsmre-b9hvNtnyx4xkG0,3701
|
|
11
11
|
letta/benchmark/constants.py,sha256=aXc5gdpMGJT327VuxsT5FngbCK2J41PQYeICBO7g_RE,536
|
|
12
|
-
letta/cli/cli.py,sha256=
|
|
12
|
+
letta/cli/cli.py,sha256=145g2WAApbeEfOjVgxBzuv6BbbDr-cZSfT_ekfj945I,16162
|
|
13
13
|
letta/cli/cli_config.py,sha256=ynsezKawQ0l95rymlv-AJ3QjbqiyaXZyuzsDfBYwMwg,8537
|
|
14
14
|
letta/cli/cli_load.py,sha256=x4L8s15GwIW13xrhKYFWHo_y-IVGtoPDHWWKcHDRP10,4587
|
|
15
15
|
letta/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
16
|
-
letta/client/client.py,sha256=
|
|
16
|
+
letta/client/client.py,sha256=lWd5Fv9UkkEn5oDPHjtbGhKNowwXA4sbhS3_OuCBStk,93707
|
|
17
17
|
letta/client/streaming.py,sha256=bfWlUu7z7EoPfKxBqIarYxGKyrL7Pj79BlliToqcCgI,4592
|
|
18
18
|
letta/client/utils.py,sha256=OJlAKWrldc4I6M1WpcTWNtPJ4wfxlzlZqWLfCozkFtI,2872
|
|
19
|
-
letta/config.py,sha256=
|
|
20
|
-
letta/constants.py,sha256=
|
|
19
|
+
letta/config.py,sha256=eK-ip06ELHNYriInkgfidDvJxQ2tD1u49I-VLXB87nE,18929
|
|
20
|
+
letta/constants.py,sha256=hCV9OyPzv2bUBJNmQk9Ap1YBeUmgXquxnF50t5ApuuQ,6437
|
|
21
21
|
letta/credentials.py,sha256=D9mlcPsdDWlIIXQQD8wSPE9M_QvsRrb0p3LB5i9OF5Q,5806
|
|
22
22
|
letta/data_sources/connectors.py,sha256=qO81ASB6V-vDPthfHYtZiyqcQDQPTT0NuD8hVwC6xI0,9907
|
|
23
23
|
letta/data_sources/connectors_helper.py,sha256=2TQjCt74fCgT5sw1AP8PalDEk06jPBbhrPG4HVr-WLs,3371
|
|
@@ -26,9 +26,9 @@ letta/errors.py,sha256=cDOo4cSYL-LA0w0b0GdsxXd5k2I1LLOY8nhtXk9YqYs,2875
|
|
|
26
26
|
letta/functions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
27
27
|
letta/functions/function_sets/base.py,sha256=N4QmOjL6gDEyOg67ocF6zVKM-NquTo-yXG_T8r18buA,6440
|
|
28
28
|
letta/functions/function_sets/extras.py,sha256=Jik3UiDqYTm4Lam1XPTvuVjvgUHwIAhopsnbmVhGMBg,4732
|
|
29
|
-
letta/functions/functions.py,sha256=
|
|
30
|
-
letta/functions/helpers.py,sha256=
|
|
31
|
-
letta/functions/schema_generator.py,sha256=
|
|
29
|
+
letta/functions/functions.py,sha256=DIF4m_IxPvitSyqrXRiBUgNnI0P7P0HsUZ7qk6j5vAM,4201
|
|
30
|
+
letta/functions/helpers.py,sha256=JU3e5xkkTVx4EevBmtyCRnidf0ncAeASvH2ZT_aBvPc,9905
|
|
31
|
+
letta/functions/schema_generator.py,sha256=GzNusbElWeaVWctFfHX9i93tiqNW16wMeS5ClKIal3A,7090
|
|
32
32
|
letta/humans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
33
33
|
letta/humans/examples/basic.txt,sha256=Lcp8YESTWvOJgO4Yf_yyQmgo5bKakeB1nIVrwEGG6PA,17
|
|
34
34
|
letta/humans/examples/cs_phd.txt,sha256=9C9ZAV_VuG7GB31ksy3-_NAyk8rjE6YtVOkhp08k1xw,297
|
|
@@ -83,19 +83,20 @@ letta/local_llm/webui/settings.py,sha256=gmLHfiOl1u4JmlAZU2d2O8YKF9lafdakyjwR_ft
|
|
|
83
83
|
letta/log.py,sha256=QHquDnL7oUAvdKlAwUlCK9zXKDMUjrU9WA0bxnMsP0Y,2101
|
|
84
84
|
letta/main.py,sha256=yHgM1lltQZvbE8k0QDQMmVyJiWEj07ZTOYIBHDxE_DQ,18709
|
|
85
85
|
letta/memory.py,sha256=6q1x3-PY-PeXzAt6hvP-UF1ajvroPZ7XW-5nLy-JhMo,17657
|
|
86
|
-
letta/metadata.py,sha256=
|
|
87
|
-
letta/o1_agent.py,sha256=
|
|
86
|
+
letta/metadata.py,sha256=vWxKnPlt6OM-Ir9UUaNwTis5eOLpss_o-GoilNl733g,27682
|
|
87
|
+
letta/o1_agent.py,sha256=LqATgTpkc02-nCH_F87EOvgxLjdjT9F07kdzj3zSdQg,3118
|
|
88
88
|
letta/openai_backcompat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
89
89
|
letta/openai_backcompat/openai_object.py,sha256=Y1ZS1sATP60qxJiOsjOP3NbwSzuzvkNAvb3DeuhM5Uk,13490
|
|
90
|
-
letta/orm/__all__.py,sha256=
|
|
90
|
+
letta/orm/__all__.py,sha256=2gh2MZTkA3Hw67VWVKK3JIStJOqTeLdpCvYSVYNeEDA,692
|
|
91
91
|
letta/orm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
92
92
|
letta/orm/base.py,sha256=9k7mwKDApJNpbrk6oXosQ7amlpeYhDzArdYTZ6BhfpQ,2405
|
|
93
93
|
letta/orm/enums.py,sha256=KfHcFt_fR6GUmSlmfsa-TetvmuRxGESNve8MStRYW64,145
|
|
94
94
|
letta/orm/errors.py,sha256=somsGtotFlb3SDM6tKdZ5TDGwEEP3ppx47ICAvNMnkg,225
|
|
95
|
-
letta/orm/mixins.py,sha256=
|
|
96
|
-
letta/orm/organization.py,sha256=
|
|
97
|
-
letta/orm/sqlalchemy_base.py,sha256=
|
|
98
|
-
letta/orm/
|
|
95
|
+
letta/orm/mixins.py,sha256=hZJFYnmSGklryuAOypvVhMgXyU7pgatGEun-p-2f_Fc,2457
|
|
96
|
+
letta/orm/organization.py,sha256=ccE0ShFWqWPdtXiCRkZCSeIERbtwU-a7AF99N3S6IRM,1468
|
|
97
|
+
letta/orm/sqlalchemy_base.py,sha256=w3x8ShZhjQY59XjDj2nWiELSi7rJDLzTAnGUBKA1_c0,8880
|
|
98
|
+
letta/orm/tool.py,sha256=EB8d9Q1n-ktM6hJ0PP7xK7bL-ankrYTS_vdFfTfS7hY,2541
|
|
99
|
+
letta/orm/user.py,sha256=kaiqduMhHYcTLPWyzWyNTysNJijkReIhVtgIJ3qPfSY,1286
|
|
99
100
|
letta/persistence_manager.py,sha256=LlLgEDpSafCPAiyKmuq0NvVAnfBkZo6TWbGIKYQjQBs,5200
|
|
100
101
|
letta/personas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
101
102
|
letta/personas/examples/anna_pa.txt,sha256=zgiNdSNhy1HQy58cF_6RFPzcg2i37F9v38YuL1CW40A,1849
|
|
@@ -123,7 +124,7 @@ letta/providers.py,sha256=tGnji2OlZSo5fgRaLiFaopqiyhKGOt5akngSjjM5RSI,19637
|
|
|
123
124
|
letta/pytest.ini,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
124
125
|
letta/schemas/agent.py,sha256=e69lAKJQYtx92w8tM9sdLdv1hDqZ_0V_qiUiQyI-uks,7138
|
|
125
126
|
letta/schemas/api_key.py,sha256=u07yzzMn-hBAHZIIKbWY16KsgiFjSNR8lAghpMUo3_4,682
|
|
126
|
-
letta/schemas/block.py,sha256=
|
|
127
|
+
letta/schemas/block.py,sha256=2_GftSIoTie6qHqUcZTfvN5bZT-p3goGcVx3TAuNOPQ,3936
|
|
127
128
|
letta/schemas/embedding_config.py,sha256=1kD6NpiXeH4roVumxqDAKk7xt8SpXGWNhZs_XXUSlEU,2855
|
|
128
129
|
letta/schemas/enums.py,sha256=WfRYpLh_pD-VyhEnp3Y6pPfx063zq2o4jky6PulqO8w,629
|
|
129
130
|
letta/schemas/file.py,sha256=Ns0V2Jp6_lmiCmLCnXsOAh_UNqTW-fstcLKjYI35VOA,1357
|
|
@@ -134,7 +135,7 @@ letta/schemas/letta_message.py,sha256=RuVVtwFbi85yP3dXQxowofQ6cI2cO_CdGtgpHGQzgH
|
|
|
134
135
|
letta/schemas/letta_request.py,sha256=_oiDshc_AoFWIfXRk2VX5-AxO5vDlyN-9r-gnyLj_30,1890
|
|
135
136
|
letta/schemas/letta_response.py,sha256=_UJoO3UtC3F5DtQCHzdiGM1SHNPYPKvopIWqg8t5YZw,1564
|
|
136
137
|
letta/schemas/llm_config.py,sha256=eFA48vKBTO70qaob8pak2CWOH7TCQeqWuClkMBc2vbY,4172
|
|
137
|
-
letta/schemas/memory.py,sha256=
|
|
138
|
+
letta/schemas/memory.py,sha256=rNUxCs11nZf_gbKgkJ-c4FRHZVhqIfTyfD2nS5WP6oI,11490
|
|
138
139
|
letta/schemas/message.py,sha256=DQxnRYrYgHXpTKfMzfS-bpCAe-BO_Rmcfc1Wf-4GHjw,33703
|
|
139
140
|
letta/schemas/openai/chat_completion_request.py,sha256=AOIwgbN3CZKVqkuXeMHeSa53u4h0wVq69t3T_LJ0vIE,3389
|
|
140
141
|
letta/schemas/openai/chat_completion_response.py,sha256=05FRfm1EsVivyeWo2aoJk34h3W4pAb4lBCPn1eujjcw,3916
|
|
@@ -144,16 +145,16 @@ letta/schemas/openai/openai.py,sha256=Hilo5BiLAGabzxCwnwfzK5QrWqwYD8epaEKFa4Pwnd
|
|
|
144
145
|
letta/schemas/organization.py,sha256=0MOUbaiDGTXkzTjaALLI2wj4E1bL5V_0jjI6jEgFKlA,635
|
|
145
146
|
letta/schemas/passage.py,sha256=eYQMxD_XjHAi72jmqcGBU4wM4VZtSU0XK8uhQxxN3Ug,3563
|
|
146
147
|
letta/schemas/source.py,sha256=hB4Ai6Nj8dFdbxv5_Qaf4uN_cmdGmnzgc-4QnHXcV3o,2562
|
|
147
|
-
letta/schemas/tool.py,sha256=
|
|
148
|
+
letta/schemas/tool.py,sha256=shkyJ-qM5QtyrfG15yKFt8qujZfeW1wfzz6n9yVS4Y8,10259
|
|
148
149
|
letta/schemas/usage.py,sha256=lvn1ooHwLEdv6gwQpw5PBUbcwn_gwdT6HA-fCiix6sY,817
|
|
149
|
-
letta/schemas/user.py,sha256=
|
|
150
|
+
letta/schemas/user.py,sha256=toiA53UKB1hpH6k2xHyQNKVeDUoSB3RmLfxSwmKPAz4,1523
|
|
150
151
|
letta/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
151
152
|
letta/server/constants.py,sha256=yAdGbLkzlOU_dLTx0lKDmAnj0ZgRXCEaIcPJWO69eaE,92
|
|
152
153
|
letta/server/rest_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
153
154
|
letta/server/rest_api/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
154
155
|
letta/server/rest_api/admin/agents.py,sha256=cFNDU4Z8wGpcWXuo5aBgX6CcxLzPpTFYnTIaiF-3qvw,564
|
|
155
156
|
letta/server/rest_api/admin/tools.py,sha256=HdXR_MRWkh3zMtb96Eaomp4rReNm3DirnXCNqAD7tNU,3093
|
|
156
|
-
letta/server/rest_api/admin/users.py,sha256=
|
|
157
|
+
letta/server/rest_api/admin/users.py,sha256=B3KeVkPpXACFZUjjc6twDSxWO8sHLtBIaO61f1dpFU4,3493
|
|
157
158
|
letta/server/rest_api/app.py,sha256=JNmDnvp9fP--hJPtPpEWgQT-14O1YOceZbWELr2vedA,6207
|
|
158
159
|
letta/server/rest_api/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
159
160
|
letta/server/rest_api/auth/index.py,sha256=fQBGyVylGSRfEMLQ17cZzrHd5Y1xiVylvPqH5Rl-lXQ,1378
|
|
@@ -175,11 +176,11 @@ letta/server/rest_api/routers/v1/jobs.py,sha256=a-j0v-5A0un0pVCOHpfeWnzpOWkVDQO6
|
|
|
175
176
|
letta/server/rest_api/routers/v1/llms.py,sha256=TcyvSx6MEM3je5F4DysL7ligmssL_pFlJaaO4uL95VY,877
|
|
176
177
|
letta/server/rest_api/routers/v1/organizations.py,sha256=3XlHPUc6ZdMOVZNdarwDM8ZxYisoHunSZQ0ozzX5orU,2037
|
|
177
178
|
letta/server/rest_api/routers/v1/sources.py,sha256=eY_pk9jRL2Y9yIZdsTjH6EuKsfH1neaTU15MKNL0dvw,8749
|
|
178
|
-
letta/server/rest_api/routers/v1/tools.py,sha256=
|
|
179
|
+
letta/server/rest_api/routers/v1/tools.py,sha256=38raONlEbflpspGenk_m8kVdE9p0Ev0SMBvAy_D25Xo,3692
|
|
179
180
|
letta/server/rest_api/routers/v1/users.py,sha256=bxQ-YdevjDqmgNDfbSPAG_4KEVvPNBHD_-Lp1MdeMec,3374
|
|
180
181
|
letta/server/rest_api/static_files.py,sha256=NG8sN4Z5EJ8JVQdj19tkFa9iQ1kBPTab9f_CUxd_u4Q,3143
|
|
181
182
|
letta/server/rest_api/utils.py,sha256=Fc2ZGKzLaBa2sEtSTVjJ8D5M0xIwsWC0CVAOIJaD3rY,2176
|
|
182
|
-
letta/server/server.py,sha256=
|
|
183
|
+
letta/server/server.py,sha256=IqVfEU4qYybWbUTrhRwcNmSwtL8nh4Qu-I3-f9c4bl4,79467
|
|
183
184
|
letta/server/startup.sh,sha256=jeGV7B_PS0hS-tT6o6GpACrUbV9WV1NI2L9aLoUDDtc,311
|
|
184
185
|
letta/server/static_files/assets/index-3ab03d5b.css,sha256=OrA9W4iKJ5h2Wlr7GwdAT4wow0CM8hVit1yOxEL49Qw,54295
|
|
185
186
|
letta/server/static_files/assets/index-d6b3669a.js,sha256=i1nHReU0RPnj-a5W0nNPV4Y9bQ0FOW0ztjMz8a2AE-Y,1821560
|
|
@@ -193,15 +194,16 @@ letta/server/ws_api/interface.py,sha256=TWl9vkcMCnLsUtgsuENZ-ku2oMDA-OUTzLh_yNRo
|
|
|
193
194
|
letta/server/ws_api/protocol.py,sha256=M_-gM5iuDBwa1cuN2IGNCG5GxMJwU2d3XW93XALv9s8,1821
|
|
194
195
|
letta/server/ws_api/server.py,sha256=C2Kv48PCwl46DQFb0ZP30s86KJLQ6dZk2AhWQEZn9pY,6004
|
|
195
196
|
letta/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
196
|
-
letta/services/organization_manager.py,sha256=
|
|
197
|
-
letta/services/
|
|
197
|
+
letta/services/organization_manager.py,sha256=wW4wOmKaqhHC7oTGWU38OO-dFtmRI0JVmq_k8gI1b0A,3658
|
|
198
|
+
letta/services/tool_manager.py,sha256=7elTmzk0vhceD8ezcywYfLvRaVEi0bxp7HFcw27CQzg,8877
|
|
199
|
+
letta/services/user_manager.py,sha256=h6K06LnYIbzw7YoQia5WGmBNSXZg5AuHZTvS54aEmSI,4534
|
|
198
200
|
letta/settings.py,sha256=yiYNmnYKj_BdTm0cBEIvQKYGU-lCmFntqsyVfRUy3_k,3411
|
|
199
201
|
letta/streaming_interface.py,sha256=_FPUWy58j50evHcpXyd7zB1wWqeCc71NCFeWh_TBvnw,15736
|
|
200
202
|
letta/streaming_utils.py,sha256=329fsvj1ZN0r0LpQtmMPZ2vSxkDBIUUwvGHZFkjm2I8,11745
|
|
201
203
|
letta/system.py,sha256=buKYPqG5n2x41hVmWpu6JUpyd7vTWED9Km2_M7dLrvk,6960
|
|
202
204
|
letta/utils.py,sha256=SXLEYhyp3gHyIjrxNIKNZZ5ittKo3KOj6zxgC_Trex0,31012
|
|
203
|
-
letta_nightly-0.5.1.
|
|
204
|
-
letta_nightly-0.5.1.
|
|
205
|
-
letta_nightly-0.5.1.
|
|
206
|
-
letta_nightly-0.5.1.
|
|
207
|
-
letta_nightly-0.5.1.
|
|
205
|
+
letta_nightly-0.5.1.dev20241026104101.dist-info/LICENSE,sha256=mExtuZ_GYJgDEI38GWdiEYZizZS4KkVt2SF1g_GPNhI,10759
|
|
206
|
+
letta_nightly-0.5.1.dev20241026104101.dist-info/METADATA,sha256=3CpXXNfUUpX9HhCvZ1q0XxYxhx4Hvbj3eW76_jyTOzs,10660
|
|
207
|
+
letta_nightly-0.5.1.dev20241026104101.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
|
208
|
+
letta_nightly-0.5.1.dev20241026104101.dist-info/entry_points.txt,sha256=2zdiyGNEZGV5oYBuS-y2nAAgjDgcC9yM_mHJBFSRt5U,40
|
|
209
|
+
letta_nightly-0.5.1.dev20241026104101.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|