letta-nightly 0.6.32.dev20250224104119__py3-none-any.whl → 0.6.33.dev20250226015402__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 +1 -1
- letta/agent.py +10 -5
- letta/constants.py +7 -0
- letta/functions/ast_parsers.py +13 -0
- letta/functions/schema_generator.py +14 -2
- letta/helpers/composio_helpers.py +3 -2
- letta/helpers/tool_execution_helper.py +171 -0
- letta/llm_api/anthropic.py +37 -1
- letta/orm/source.py +2 -2
- letta/schemas/openai/chat_completion_request.py +1 -1
- letta/schemas/providers.py +43 -4
- letta/schemas/tool.py +1 -13
- letta/server/rest_api/routers/openai/chat_completions/chat_completions.py +225 -35
- letta/server/rest_api/routers/v1/agents.py +57 -55
- letta/server/rest_api/routers/v1/blocks.py +12 -12
- letta/server/rest_api/routers/v1/identities.py +12 -12
- letta/server/rest_api/routers/v1/jobs.py +8 -8
- letta/server/rest_api/routers/v1/providers.py +11 -5
- letta/server/rest_api/routers/v1/runs.py +12 -12
- letta/server/rest_api/routers/v1/sandbox_configs.py +24 -24
- letta/server/rest_api/routers/v1/sources.py +20 -20
- letta/server/rest_api/routers/v1/steps.py +8 -7
- letta/server/rest_api/routers/v1/tags.py +2 -2
- letta/server/rest_api/routers/v1/tools.py +20 -20
- letta/server/rest_api/utils.py +2 -3
- letta/services/agent_manager.py +36 -0
- letta/services/block_manager.py +4 -2
- letta/services/identity_manager.py +6 -0
- letta/services/message_manager.py +4 -1
- letta/services/provider_manager.py +10 -9
- letta/services/step_manager.py +2 -2
- {letta_nightly-0.6.32.dev20250224104119.dist-info → letta_nightly-0.6.33.dev20250226015402.dist-info}/METADATA +1 -1
- {letta_nightly-0.6.32.dev20250224104119.dist-info → letta_nightly-0.6.33.dev20250226015402.dist-info}/RECORD +36 -35
- {letta_nightly-0.6.32.dev20250224104119.dist-info → letta_nightly-0.6.33.dev20250226015402.dist-info}/LICENSE +0 -0
- {letta_nightly-0.6.32.dev20250224104119.dist-info → letta_nightly-0.6.33.dev20250226015402.dist-info}/WHEEL +0 -0
- {letta_nightly-0.6.32.dev20250224104119.dist-info → letta_nightly-0.6.33.dev20250226015402.dist-info}/entry_points.txt +0 -0
|
@@ -29,12 +29,12 @@ logger = get_logger(__name__)
|
|
|
29
29
|
def delete_tool(
|
|
30
30
|
tool_id: str,
|
|
31
31
|
server: SyncServer = Depends(get_letta_server),
|
|
32
|
-
|
|
32
|
+
actor_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
|
|
33
33
|
):
|
|
34
34
|
"""
|
|
35
35
|
Delete a tool by name
|
|
36
36
|
"""
|
|
37
|
-
actor = server.user_manager.get_user_or_default(user_id=
|
|
37
|
+
actor = server.user_manager.get_user_or_default(user_id=actor_id)
|
|
38
38
|
server.tool_manager.delete_tool_by_id(tool_id=tool_id, actor=actor)
|
|
39
39
|
|
|
40
40
|
|
|
@@ -42,12 +42,12 @@ def delete_tool(
|
|
|
42
42
|
def retrieve_tool(
|
|
43
43
|
tool_id: str,
|
|
44
44
|
server: SyncServer = Depends(get_letta_server),
|
|
45
|
-
|
|
45
|
+
actor_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
|
|
46
46
|
):
|
|
47
47
|
"""
|
|
48
48
|
Get a tool by ID
|
|
49
49
|
"""
|
|
50
|
-
actor = server.user_manager.get_user_or_default(user_id=
|
|
50
|
+
actor = server.user_manager.get_user_or_default(user_id=actor_id)
|
|
51
51
|
tool = server.tool_manager.get_tool_by_id(tool_id=tool_id, actor=actor)
|
|
52
52
|
if tool is None:
|
|
53
53
|
# return 404 error
|
|
@@ -61,13 +61,13 @@ def list_tools(
|
|
|
61
61
|
limit: Optional[int] = 50,
|
|
62
62
|
name: Optional[str] = None,
|
|
63
63
|
server: SyncServer = Depends(get_letta_server),
|
|
64
|
-
|
|
64
|
+
actor_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
|
|
65
65
|
):
|
|
66
66
|
"""
|
|
67
67
|
Get a list of all tools available to agents belonging to the org of the user
|
|
68
68
|
"""
|
|
69
69
|
try:
|
|
70
|
-
actor = server.user_manager.get_user_or_default(user_id=
|
|
70
|
+
actor = server.user_manager.get_user_or_default(user_id=actor_id)
|
|
71
71
|
if name is not None:
|
|
72
72
|
tool = server.tool_manager.get_tool_by_name(tool_name=name, actor=actor)
|
|
73
73
|
return [tool] if tool else []
|
|
@@ -82,13 +82,13 @@ def list_tools(
|
|
|
82
82
|
def create_tool(
|
|
83
83
|
request: ToolCreate = Body(...),
|
|
84
84
|
server: SyncServer = Depends(get_letta_server),
|
|
85
|
-
|
|
85
|
+
actor_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
|
|
86
86
|
):
|
|
87
87
|
"""
|
|
88
88
|
Create a new tool
|
|
89
89
|
"""
|
|
90
90
|
try:
|
|
91
|
-
actor = server.user_manager.get_user_or_default(user_id=
|
|
91
|
+
actor = server.user_manager.get_user_or_default(user_id=actor_id)
|
|
92
92
|
tool = Tool(**request.model_dump())
|
|
93
93
|
return server.tool_manager.create_tool(pydantic_tool=tool, actor=actor)
|
|
94
94
|
except UniqueConstraintViolationError as e:
|
|
@@ -114,13 +114,13 @@ def create_tool(
|
|
|
114
114
|
def upsert_tool(
|
|
115
115
|
request: ToolCreate = Body(...),
|
|
116
116
|
server: SyncServer = Depends(get_letta_server),
|
|
117
|
-
|
|
117
|
+
actor_id: Optional[str] = Header(None, alias="user_id"),
|
|
118
118
|
):
|
|
119
119
|
"""
|
|
120
120
|
Create or update a tool
|
|
121
121
|
"""
|
|
122
122
|
try:
|
|
123
|
-
actor = server.user_manager.get_user_or_default(user_id=
|
|
123
|
+
actor = server.user_manager.get_user_or_default(user_id=actor_id)
|
|
124
124
|
tool = server.tool_manager.create_or_update_tool(pydantic_tool=Tool(**request.model_dump()), actor=actor)
|
|
125
125
|
return tool
|
|
126
126
|
except UniqueConstraintViolationError as e:
|
|
@@ -142,13 +142,13 @@ def modify_tool(
|
|
|
142
142
|
tool_id: str,
|
|
143
143
|
request: ToolUpdate = Body(...),
|
|
144
144
|
server: SyncServer = Depends(get_letta_server),
|
|
145
|
-
|
|
145
|
+
actor_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
|
|
146
146
|
):
|
|
147
147
|
"""
|
|
148
148
|
Update an existing tool
|
|
149
149
|
"""
|
|
150
150
|
try:
|
|
151
|
-
actor = server.user_manager.get_user_or_default(user_id=
|
|
151
|
+
actor = server.user_manager.get_user_or_default(user_id=actor_id)
|
|
152
152
|
return server.tool_manager.update_tool_by_id(tool_id=tool_id, tool_update=request, actor=actor)
|
|
153
153
|
except LettaToolCreateError as e:
|
|
154
154
|
# HTTP 400 == Bad Request
|
|
@@ -163,12 +163,12 @@ def modify_tool(
|
|
|
163
163
|
@router.post("/add-base-tools", response_model=List[Tool], operation_id="add_base_tools")
|
|
164
164
|
def upsert_base_tools(
|
|
165
165
|
server: SyncServer = Depends(get_letta_server),
|
|
166
|
-
|
|
166
|
+
actor_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
|
|
167
167
|
):
|
|
168
168
|
"""
|
|
169
169
|
Upsert base tools
|
|
170
170
|
"""
|
|
171
|
-
actor = server.user_manager.get_user_or_default(user_id=
|
|
171
|
+
actor = server.user_manager.get_user_or_default(user_id=actor_id)
|
|
172
172
|
return server.tool_manager.upsert_base_tools(actor=actor)
|
|
173
173
|
|
|
174
174
|
|
|
@@ -176,12 +176,12 @@ def upsert_base_tools(
|
|
|
176
176
|
def run_tool_from_source(
|
|
177
177
|
server: SyncServer = Depends(get_letta_server),
|
|
178
178
|
request: ToolRunFromSource = Body(...),
|
|
179
|
-
|
|
179
|
+
actor_id: Optional[str] = Header(None, alias="user_id"), # Extract user_id from header, default to None if not present
|
|
180
180
|
):
|
|
181
181
|
"""
|
|
182
182
|
Attempt to build a tool from source, then run it on the provided arguments
|
|
183
183
|
"""
|
|
184
|
-
actor = server.user_manager.get_user_or_default(user_id=
|
|
184
|
+
actor = server.user_manager.get_user_or_default(user_id=actor_id)
|
|
185
185
|
|
|
186
186
|
try:
|
|
187
187
|
return server.run_tool_from_source(
|
|
@@ -227,12 +227,12 @@ def list_composio_apps(server: SyncServer = Depends(get_letta_server), user_id:
|
|
|
227
227
|
def list_composio_actions_by_app(
|
|
228
228
|
composio_app_name: str,
|
|
229
229
|
server: SyncServer = Depends(get_letta_server),
|
|
230
|
-
|
|
230
|
+
actor_id: Optional[str] = Header(None, alias="user_id"),
|
|
231
231
|
):
|
|
232
232
|
"""
|
|
233
233
|
Get a list of all Composio actions for a specific app
|
|
234
234
|
"""
|
|
235
|
-
actor = server.user_manager.get_user_or_default(user_id=
|
|
235
|
+
actor = server.user_manager.get_user_or_default(user_id=actor_id)
|
|
236
236
|
composio_api_key = get_composio_api_key(actor=actor, logger=logger)
|
|
237
237
|
if not composio_api_key:
|
|
238
238
|
raise HTTPException(
|
|
@@ -246,12 +246,12 @@ def list_composio_actions_by_app(
|
|
|
246
246
|
def add_composio_tool(
|
|
247
247
|
composio_action_name: str,
|
|
248
248
|
server: SyncServer = Depends(get_letta_server),
|
|
249
|
-
|
|
249
|
+
actor_id: Optional[str] = Header(None, alias="user_id"),
|
|
250
250
|
):
|
|
251
251
|
"""
|
|
252
252
|
Add a new Composio tool by action name (Composio refers to each tool as an `Action`)
|
|
253
253
|
"""
|
|
254
|
-
actor = server.user_manager.get_user_or_default(user_id=
|
|
254
|
+
actor = server.user_manager.get_user_or_default(user_id=actor_id)
|
|
255
255
|
|
|
256
256
|
try:
|
|
257
257
|
tool_create = ToolCreate.from_composio(action_name=composio_action_name)
|
letta/server/rest_api/utils.py
CHANGED
|
@@ -7,7 +7,6 @@ from datetime import datetime, timezone
|
|
|
7
7
|
from enum import Enum
|
|
8
8
|
from typing import TYPE_CHECKING, AsyncGenerator, Dict, Iterable, List, Optional, Union, cast
|
|
9
9
|
|
|
10
|
-
import pytz
|
|
11
10
|
from fastapi import Header, HTTPException
|
|
12
11
|
from openai.types.chat import ChatCompletionMessageParam
|
|
13
12
|
from openai.types.chat.chat_completion_message_tool_call import ChatCompletionMessageToolCall as OpenAIToolCall
|
|
@@ -145,7 +144,7 @@ def create_user_message(input_message: dict, agent_id: str, actor: User) -> Mess
|
|
|
145
144
|
Converts a user input message into the internal structured format.
|
|
146
145
|
"""
|
|
147
146
|
# Generate timestamp in the correct format
|
|
148
|
-
now = datetime.now(
|
|
147
|
+
now = datetime.now(timezone.utc).isoformat()
|
|
149
148
|
|
|
150
149
|
# Format message as structured JSON
|
|
151
150
|
structured_message = {"type": "user_message", "message": input_message["content"], "time": now}
|
|
@@ -197,7 +196,7 @@ def create_assistant_message_from_openai_response(
|
|
|
197
196
|
agent_id=agent_id,
|
|
198
197
|
model=model,
|
|
199
198
|
tool_calls=[tool_call],
|
|
200
|
-
tool_call_id=
|
|
199
|
+
tool_call_id=tool_call_id,
|
|
201
200
|
created_at=datetime.now(timezone.utc),
|
|
202
201
|
)
|
|
203
202
|
|
letta/services/agent_manager.py
CHANGED
|
@@ -21,8 +21,10 @@ from letta.orm.sqlite_functions import adapt_array
|
|
|
21
21
|
from letta.schemas.agent import AgentState as PydanticAgentState
|
|
22
22
|
from letta.schemas.agent import AgentType, CreateAgent, UpdateAgent
|
|
23
23
|
from letta.schemas.block import Block as PydanticBlock
|
|
24
|
+
from letta.schemas.block import BlockUpdate
|
|
24
25
|
from letta.schemas.embedding_config import EmbeddingConfig
|
|
25
26
|
from letta.schemas.llm_config import LLMConfig
|
|
27
|
+
from letta.schemas.memory import Memory
|
|
26
28
|
from letta.schemas.message import Message as PydanticMessage
|
|
27
29
|
from letta.schemas.message import MessageCreate
|
|
28
30
|
from letta.schemas.passage import Passage as PydanticPassage
|
|
@@ -613,6 +615,40 @@ class AgentManager:
|
|
|
613
615
|
)
|
|
614
616
|
return self.append_to_in_context_messages([system_message], agent_id=agent_state.id, actor=actor)
|
|
615
617
|
|
|
618
|
+
# TODO: I moved this from agent.py - replace all mentions of this with the agent_manager version
|
|
619
|
+
@enforce_types
|
|
620
|
+
def update_memory_if_changed(self, agent_id: str, new_memory: Memory, actor: PydanticUser) -> PydanticAgentState:
|
|
621
|
+
"""
|
|
622
|
+
Update internal memory object and system prompt if there have been modifications.
|
|
623
|
+
|
|
624
|
+
Args:
|
|
625
|
+
new_memory (Memory): the new memory object to compare to the current memory object
|
|
626
|
+
|
|
627
|
+
Returns:
|
|
628
|
+
modified (bool): whether the memory was updated
|
|
629
|
+
"""
|
|
630
|
+
agent_state = self.get_agent_by_id(agent_id=agent_id, actor=actor)
|
|
631
|
+
if agent_state.memory.compile() != new_memory.compile():
|
|
632
|
+
# update the blocks (LRW) in the DB
|
|
633
|
+
for label in agent_state.memory.list_block_labels():
|
|
634
|
+
updated_value = new_memory.get_block(label).value
|
|
635
|
+
if updated_value != agent_state.memory.get_block(label).value:
|
|
636
|
+
# update the block if it's changed
|
|
637
|
+
block_id = agent_state.memory.get_block(label).id
|
|
638
|
+
block = self.block_manager.update_block(block_id=block_id, block_update=BlockUpdate(value=updated_value), actor=actor)
|
|
639
|
+
|
|
640
|
+
# refresh memory from DB (using block ids)
|
|
641
|
+
agent_state.memory = Memory(
|
|
642
|
+
blocks=[self.block_manager.get_block_by_id(block.id, actor=actor) for block in agent_state.memory.get_blocks()]
|
|
643
|
+
)
|
|
644
|
+
|
|
645
|
+
# NOTE: don't do this since re-buildin the memory is handled at the start of the step
|
|
646
|
+
# rebuild memory - this records the last edited timestamp of the memory
|
|
647
|
+
# TODO: pass in update timestamp from block edit time
|
|
648
|
+
agent_state = self.rebuild_system_prompt(agent_id=agent_id, actor=actor)
|
|
649
|
+
|
|
650
|
+
return agent_state
|
|
651
|
+
|
|
616
652
|
# ======================================================================================================================
|
|
617
653
|
# Source Management
|
|
618
654
|
# ======================================================================================================================
|
letta/services/block_manager.py
CHANGED
|
@@ -107,12 +107,14 @@ class BlockManager:
|
|
|
107
107
|
@enforce_types
|
|
108
108
|
def add_default_blocks(self, actor: PydanticUser):
|
|
109
109
|
for persona_file in list_persona_files():
|
|
110
|
-
|
|
110
|
+
with open(persona_file, "r", encoding="utf-8") as f:
|
|
111
|
+
text = f.read()
|
|
111
112
|
name = os.path.basename(persona_file).replace(".txt", "")
|
|
112
113
|
self.create_or_update_block(Persona(template_name=name, value=text, is_template=True), actor=actor)
|
|
113
114
|
|
|
114
115
|
for human_file in list_human_files():
|
|
115
|
-
|
|
116
|
+
with open(human_file, "r", encoding="utf-8") as f:
|
|
117
|
+
text = f.read()
|
|
116
118
|
name = os.path.basename(human_file).replace(".txt", "")
|
|
117
119
|
self.create_or_update_block(Human(template_name=name, value=text, is_template=True), actor=actor)
|
|
118
120
|
|
|
@@ -111,6 +111,12 @@ class IdentityManager:
|
|
|
111
111
|
existing_identity.name = identity.name
|
|
112
112
|
if identity.identity_type is not None:
|
|
113
113
|
existing_identity.identity_type = identity.identity_type
|
|
114
|
+
if identity.properties is not None:
|
|
115
|
+
if replace:
|
|
116
|
+
existing_identity.properties = [prop.model_dump() for prop in identity.properties]
|
|
117
|
+
else:
|
|
118
|
+
new_properties = existing_identity.properties + identity.properties
|
|
119
|
+
existing_identity.properties = [prop.model_dump() for prop in new_properties]
|
|
114
120
|
|
|
115
121
|
self._process_agent_relationship(
|
|
116
122
|
session=session, identity=existing_identity, agent_ids=identity.agent_ids, allow_partial=False, replace=replace
|
|
@@ -2,6 +2,7 @@ from typing import List, Optional
|
|
|
2
2
|
|
|
3
3
|
from sqlalchemy import and_, or_
|
|
4
4
|
|
|
5
|
+
from letta.log import get_logger
|
|
5
6
|
from letta.orm.agent import Agent as AgentModel
|
|
6
7
|
from letta.orm.errors import NoResultFound
|
|
7
8
|
from letta.orm.message import Message as MessageModel
|
|
@@ -11,6 +12,8 @@ from letta.schemas.message import MessageUpdate
|
|
|
11
12
|
from letta.schemas.user import User as PydanticUser
|
|
12
13
|
from letta.utils import enforce_types
|
|
13
14
|
|
|
15
|
+
logger = get_logger(__name__)
|
|
16
|
+
|
|
14
17
|
|
|
15
18
|
class MessageManager:
|
|
16
19
|
"""Manager class to handle business logic related to Messages."""
|
|
@@ -37,7 +40,7 @@ class MessageManager:
|
|
|
37
40
|
results = MessageModel.list(db_session=session, id=message_ids, organization_id=actor.organization_id, limit=len(message_ids))
|
|
38
41
|
|
|
39
42
|
if len(results) != len(message_ids):
|
|
40
|
-
|
|
43
|
+
logger.warning(
|
|
41
44
|
f"Expected {len(message_ids)} messages, but found {len(results)}. Missing ids={set(message_ids) - set([r.id for r in results])}"
|
|
42
45
|
)
|
|
43
46
|
|
|
@@ -25,15 +25,15 @@ class ProviderManager:
|
|
|
25
25
|
provider.resolve_identifier()
|
|
26
26
|
|
|
27
27
|
new_provider = ProviderModel(**provider.model_dump(to_orm=True, exclude_unset=True))
|
|
28
|
-
new_provider.create(session)
|
|
28
|
+
new_provider.create(session, actor=actor)
|
|
29
29
|
return new_provider.to_pydantic()
|
|
30
30
|
|
|
31
31
|
@enforce_types
|
|
32
|
-
def update_provider(self, provider_update: ProviderUpdate) -> PydanticProvider:
|
|
32
|
+
def update_provider(self, provider_update: ProviderUpdate, actor: PydanticUser) -> PydanticProvider:
|
|
33
33
|
"""Update provider details."""
|
|
34
34
|
with self.session_maker() as session:
|
|
35
35
|
# Retrieve the existing provider by ID
|
|
36
|
-
existing_provider = ProviderModel.read(db_session=session, identifier=provider_update.id)
|
|
36
|
+
existing_provider = ProviderModel.read(db_session=session, identifier=provider_update.id, actor=actor)
|
|
37
37
|
|
|
38
38
|
# Update only the fields that are provided in ProviderUpdate
|
|
39
39
|
update_data = provider_update.model_dump(to_orm=True, exclude_unset=True, exclude_none=True)
|
|
@@ -41,31 +41,32 @@ class ProviderManager:
|
|
|
41
41
|
setattr(existing_provider, key, value)
|
|
42
42
|
|
|
43
43
|
# Commit the updated provider
|
|
44
|
-
existing_provider.update(session)
|
|
44
|
+
existing_provider.update(session, actor=actor)
|
|
45
45
|
return existing_provider.to_pydantic()
|
|
46
46
|
|
|
47
47
|
@enforce_types
|
|
48
|
-
def delete_provider_by_id(self, provider_id: str):
|
|
48
|
+
def delete_provider_by_id(self, provider_id: str, actor: PydanticUser):
|
|
49
49
|
"""Delete a provider."""
|
|
50
50
|
with self.session_maker() as session:
|
|
51
51
|
# Clear api key field
|
|
52
|
-
existing_provider = ProviderModel.read(db_session=session, identifier=provider_id)
|
|
52
|
+
existing_provider = ProviderModel.read(db_session=session, identifier=provider_id, actor=actor)
|
|
53
53
|
existing_provider.api_key = None
|
|
54
|
-
existing_provider.update(session)
|
|
54
|
+
existing_provider.update(session, actor=actor)
|
|
55
55
|
|
|
56
56
|
# Soft delete in provider table
|
|
57
|
-
existing_provider.delete(session)
|
|
57
|
+
existing_provider.delete(session, actor=actor)
|
|
58
58
|
|
|
59
59
|
session.commit()
|
|
60
60
|
|
|
61
61
|
@enforce_types
|
|
62
|
-
def list_providers(self, after: Optional[str] = None, limit: Optional[int] = 50) -> List[PydanticProvider]:
|
|
62
|
+
def list_providers(self, after: Optional[str] = None, limit: Optional[int] = 50, actor: PydanticUser = None) -> List[PydanticProvider]:
|
|
63
63
|
"""List all providers with optional pagination."""
|
|
64
64
|
with self.session_maker() as session:
|
|
65
65
|
providers = ProviderModel.list(
|
|
66
66
|
db_session=session,
|
|
67
67
|
after=after,
|
|
68
68
|
limit=limit,
|
|
69
|
+
actor=actor,
|
|
69
70
|
)
|
|
70
71
|
return [provider.to_pydantic() for provider in providers]
|
|
71
72
|
|
letta/services/step_manager.py
CHANGED
|
@@ -84,9 +84,9 @@ class StepManager:
|
|
|
84
84
|
return new_step.to_pydantic()
|
|
85
85
|
|
|
86
86
|
@enforce_types
|
|
87
|
-
def get_step(self, step_id: str) -> PydanticStep:
|
|
87
|
+
def get_step(self, step_id: str, actor: PydanticUser) -> PydanticStep:
|
|
88
88
|
with self.session_maker() as session:
|
|
89
|
-
step = StepModel.read(db_session=session, identifier=step_id)
|
|
89
|
+
step = StepModel.read(db_session=session, identifier=step_id, actor=actor)
|
|
90
90
|
return step.to_pydantic()
|
|
91
91
|
|
|
92
92
|
@enforce_types
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
letta/__init__.py,sha256=
|
|
1
|
+
letta/__init__.py,sha256=ZG24l5R0k4y_ttVVqlMdf3VtTG63oUJlIbU0I38-TrM,918
|
|
2
2
|
letta/__main__.py,sha256=6Hs2PV7EYc5Tid4g4OtcLXhqVHiNYTGzSBdoOnW2HXA,29
|
|
3
|
-
letta/agent.py,sha256=
|
|
3
|
+
letta/agent.py,sha256=NqmrtW0gNfo0kT15WzRfY-TzhMDx4TaWfEmPUWSB2FI,60921
|
|
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
|
|
@@ -12,32 +12,33 @@ letta/client/client.py,sha256=7RQjZ-3yn_Hc9QsZoNCFRilyvfTq-Xie2sNbs1Lmbh4,138697
|
|
|
12
12
|
letta/client/streaming.py,sha256=lN9vamc07sfQlRbFif327GvURLUPhx-4AC_oUOPvs6w,4543
|
|
13
13
|
letta/client/utils.py,sha256=VCGV-op5ZSmurd4yw7Vhf93XDQ0BkyBT8qsuV7EqfiU,2859
|
|
14
14
|
letta/config.py,sha256=JFGY4TWW0Wm5fTbZamOwWqk5G8Nn-TXyhgByGoAqy2c,12375
|
|
15
|
-
letta/constants.py,sha256=
|
|
15
|
+
letta/constants.py,sha256=9ZT-kJAZWgB4rqPlYX6Ec_WTk13j-QrNnRu4TFiuq7Y,7453
|
|
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=zqlfbN3aCgSOlNd9M2NW9zrwx4WwQzketb8oa5BzzE8,10831
|
|
19
19
|
letta/errors.py,sha256=6fQXg2unP-2fo3R7db0ayKKWlD2XMusOPNi9TgJplCg,5558
|
|
20
20
|
letta/functions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
21
|
-
letta/functions/ast_parsers.py,sha256=
|
|
21
|
+
letta/functions/ast_parsers.py,sha256=3ejgFDLbGxGMnYRe1d9YCqoo-ehSrmdDQTsxGM-shTM,4161
|
|
22
22
|
letta/functions/function_sets/base.py,sha256=M3_1Pge2GiyITp_U73T_Sd9O2rFoNlbuT8KgzMjexfs,5999
|
|
23
23
|
letta/functions/function_sets/extras.py,sha256=R1a97EKepEPDxJKsxQPFdXXWQrkVppOvKbEkRc_79tc,4852
|
|
24
24
|
letta/functions/function_sets/multi_agent.py,sha256=BcMeod0-lMhnKeaVWJp2T1PzRV0qvCuTWAPMJxAbgHI,4073
|
|
25
25
|
letta/functions/functions.py,sha256=NyWLh7a-f4mXti5vM1oWDwXzfA58VmVVqL03O9vosKY,5672
|
|
26
26
|
letta/functions/helpers.py,sha256=TBji0j7hWT6DvjYY5gfN0CzxCRsVGh8uA6ACp9V3v3M,23185
|
|
27
27
|
letta/functions/interface.py,sha256=s_PPp5WDvGH_y9KUpMlORkdC141ITczFk3wsevrrUD8,2866
|
|
28
|
-
letta/functions/schema_generator.py,sha256=
|
|
28
|
+
letta/functions/schema_generator.py,sha256=s10835BHVuGZPGgByjNhDTO9-zv5eOYMPajQh3hFo1c,20678
|
|
29
29
|
letta/helpers/__init__.py,sha256=p0luQ1Oe3Skc6sH4O58aHHA3Qbkyjifpuq0DZ1GAY0U,59
|
|
30
|
-
letta/helpers/composio_helpers.py,sha256=
|
|
30
|
+
letta/helpers/composio_helpers.py,sha256=6CWV483vE3N-keQlblexxBiQHxorMAgQuvbok4adGO4,949
|
|
31
31
|
letta/helpers/converters.py,sha256=TL3g69RsSByx0IzO434nO3c8zwfPKEIj0R5QAiBsyKM,5415
|
|
32
32
|
letta/helpers/datetime_helpers.py,sha256=7U5ZJkE0cLki4sG8ukIHZSAoFfQpLWQu2kFekETy6Zg,2633
|
|
33
33
|
letta/helpers/json_helpers.py,sha256=PWZ5HhSqGXO4e563dM_8M72q7ScirjXQ4Rv1ckohaV8,396
|
|
34
|
+
letta/helpers/tool_execution_helper.py,sha256=bskCscuz2nqoUboFcYA7sQGeikdEyqiYnNpO4gLQTdc,7469
|
|
34
35
|
letta/helpers/tool_rule_solver.py,sha256=z-2Zq_qWykgWanFZYxtxUee4FkMnxqvntXe2tomoH68,6774
|
|
35
36
|
letta/humans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
37
|
letta/humans/examples/basic.txt,sha256=Lcp8YESTWvOJgO4Yf_yyQmgo5bKakeB1nIVrwEGG6PA,17
|
|
37
38
|
letta/humans/examples/cs_phd.txt,sha256=9C9ZAV_VuG7GB31ksy3-_NAyk8rjE6YtVOkhp08k1xw,297
|
|
38
39
|
letta/interface.py,sha256=6CrnvydRZfVY9BQ4fCn85rmQU6D9udcsGww8nTnT95E,12793
|
|
39
40
|
letta/llm_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
40
|
-
letta/llm_api/anthropic.py,sha256=
|
|
41
|
+
letta/llm_api/anthropic.py,sha256=hsRuS0-bj74ID4_axQiMwjb8ZmpInStumaHTqvMP_M4,37426
|
|
41
42
|
letta/llm_api/aws_bedrock.py,sha256=J_oCM810-m2T-tgo3iRwSM0BuykBN5AK3SbkyiOaGbc,3835
|
|
42
43
|
letta/llm_api/azure_openai.py,sha256=Y1HKPog1XzM_f7ujUK_Gv2zQkoy5pU-1bKiUnvSxSrs,6297
|
|
43
44
|
letta/llm_api/azure_openai_constants.py,sha256=ZaR2IasJThijG0uhLKJThrixdAxLPD2IojfeaJ-KQMQ,294
|
|
@@ -114,7 +115,7 @@ letta/orm/organization.py,sha256=ciF2ffCBMddfOQ9O1gHv_cFMTPUlSQZNDYYXFgH_z1E,307
|
|
|
114
115
|
letta/orm/passage.py,sha256=tQi-fZZFBFVz0KZxd0foKPkAOaempgiYOHHK6lJ98gw,3332
|
|
115
116
|
letta/orm/provider.py,sha256=-qA9tvKTZgaM4D7CoDZZiA7zTgjaaWDV4jZvifQv_MM,805
|
|
116
117
|
letta/orm/sandbox_config.py,sha256=DyOy_1_zCMlp13elCqPcuuA6OwUove6mrjhcpROTg50,4150
|
|
117
|
-
letta/orm/source.py,sha256=
|
|
118
|
+
letta/orm/source.py,sha256=z89VZUHV9K8Ew9JCYoZqUeRb1WEUKmrn0MMFkppaphE,2117
|
|
118
119
|
letta/orm/sources_agents.py,sha256=Ik_PokCBrXRd9wXWomeNeb8EtLUwjb9VMZ8LWXqpK5A,473
|
|
119
120
|
letta/orm/sqlalchemy_base.py,sha256=tIuKJ0CH4tYCzhpDqqr2EDD6AxGlnXI752oYZtlvM6o,22151
|
|
120
121
|
letta/orm/sqlite_functions.py,sha256=JCScKiRlYCKxy9hChQ8wsk4GMKknZE24MunnG3fM1Gw,4255
|
|
@@ -167,19 +168,19 @@ letta/schemas/llm_config.py,sha256=R0GQvw3DzsShpxZY6eWte4A2f1QjUrAAJ928DvLuBZs,5
|
|
|
167
168
|
letta/schemas/llm_config_overrides.py,sha256=-oRglCTcajF6UAK3RAa0FLWVuKODPI1v403fDIWMAtA,1815
|
|
168
169
|
letta/schemas/memory.py,sha256=GOYDfPKzbWftUWO9Hv4KW7xAi1EIQmC8zpP7qvEkVHw,10245
|
|
169
170
|
letta/schemas/message.py,sha256=3-0zd-WuasJ1rZPDSqwJ7mRex399icPgpsVk19T7CoQ,37687
|
|
170
|
-
letta/schemas/openai/chat_completion_request.py,sha256=
|
|
171
|
+
letta/schemas/openai/chat_completion_request.py,sha256=3tALmbBV2pv1CcqzNLBxxIPOQ8Z85woucT7FN0fuDic,3402
|
|
171
172
|
letta/schemas/openai/chat_completion_response.py,sha256=koEb_NTiz5YsAAX81Z0cSqSFX4a6MdD2lhoXtxF_rw4,4100
|
|
172
173
|
letta/schemas/openai/chat_completions.py,sha256=l0e9sT9boTD5VBU5YtJ0s7qUtCfFGB2K-gQLeEZ2LHU,3599
|
|
173
174
|
letta/schemas/openai/embedding_response.py,sha256=WKIZpXab1Av7v6sxKG8feW3ZtpQUNosmLVSuhXYa_xU,357
|
|
174
175
|
letta/schemas/openai/openai.py,sha256=Hilo5BiLAGabzxCwnwfzK5QrWqwYD8epaEKFa4Pwndk,7970
|
|
175
176
|
letta/schemas/organization.py,sha256=_RR8jlOOdJyG31q53IDdIvBVvIfAZrQWAGuvc5HmW24,788
|
|
176
177
|
letta/schemas/passage.py,sha256=RG0vkaewEu4a_NAZM-FVyMammHjqpPP0RDYAdu27g6A,3723
|
|
177
|
-
letta/schemas/providers.py,sha256=
|
|
178
|
+
letta/schemas/providers.py,sha256=JUFdujrLmrGA84tybQ4aquxknEyiod47lRKrpStm9s4,41351
|
|
178
179
|
letta/schemas/run.py,sha256=SRqPRziINIiPunjOhE_NlbnQYgxTvqmbauni_yfBQRA,2085
|
|
179
180
|
letta/schemas/sandbox_config.py,sha256=Nz8K5brqe6jpf66KnTJ0-E7ZeFdPoBFGN-XOI35OeaY,5926
|
|
180
181
|
letta/schemas/source.py,sha256=-BQVolcXA2ziCu2ztR6cbTdGUc8G7vGJy7rvpdf1hpg,2880
|
|
181
182
|
letta/schemas/step.py,sha256=wQ-AzhMjH7tLFgZbJfcPkW9a9V81JYWzJCQtTfcb11E,2034
|
|
182
|
-
letta/schemas/tool.py,sha256=
|
|
183
|
+
letta/schemas/tool.py,sha256=xRGKnzlCdxTlSBjnsLe0h2CuGJa3d-GN4G-kjmCEDbw,10165
|
|
183
184
|
letta/schemas/tool_rule.py,sha256=2YQZba4fXS3u4j8pIk7BDujfq8rnxSVMwJSyaVgApH4,2149
|
|
184
185
|
letta/schemas/usage.py,sha256=8oYRH-JX0PfjIu2zkT5Uu3UWQ7Unnz_uHiO8hRGI4m0,912
|
|
185
186
|
letta/schemas/user.py,sha256=V32Tgl6oqB3KznkxUz12y7agkQicjzW7VocSpj78i6Q,1526
|
|
@@ -202,25 +203,25 @@ letta/server/rest_api/interface.py,sha256=jAt7azrk27sNKNCZHgoIzYDIUbEgJ8hsC3Ef7O
|
|
|
202
203
|
letta/server/rest_api/optimistic_json_parser.py,sha256=1z4d9unmxMb0ou7owJ62uUQoNjNYf21FmaNdg0ZcqUU,6567
|
|
203
204
|
letta/server/rest_api/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
204
205
|
letta/server/rest_api/routers/openai/chat_completions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
205
|
-
letta/server/rest_api/routers/openai/chat_completions/chat_completions.py,sha256=
|
|
206
|
+
letta/server/rest_api/routers/openai/chat_completions/chat_completions.py,sha256=8u7n42niB_6X5uShMa76-ldAMdx7lHG-6ax8GEAr25s,17478
|
|
206
207
|
letta/server/rest_api/routers/v1/__init__.py,sha256=kQUDemPYl4ZcOndpsexbLQRAObkuDN00ZYTnQJYiHNk,1269
|
|
207
|
-
letta/server/rest_api/routers/v1/agents.py,sha256=
|
|
208
|
-
letta/server/rest_api/routers/v1/blocks.py,sha256=
|
|
208
|
+
letta/server/rest_api/routers/v1/agents.py,sha256=Ac7IpwwxutLKziJIzTKTrh90cd3u0aC6Nixbxbo7bE0,26274
|
|
209
|
+
letta/server/rest_api/routers/v1/blocks.py,sha256=0j7JX2BQzk31RyhvPZeEb-zh9ImXsVU4_8y5XMiR_WA,3900
|
|
209
210
|
letta/server/rest_api/routers/v1/health.py,sha256=MoOjkydhGcJXTiuJrKIB0etVXiRMdTa51S8RQ8-50DQ,399
|
|
210
|
-
letta/server/rest_api/routers/v1/identities.py,sha256=
|
|
211
|
-
letta/server/rest_api/routers/v1/jobs.py,sha256=
|
|
211
|
+
letta/server/rest_api/routers/v1/identities.py,sha256=CCEF-e91yXOaHevEM0cpPoTHGnWNVljvKD5YC1nFvVk,4981
|
|
212
|
+
letta/server/rest_api/routers/v1/jobs.py,sha256=4oeJfI2odNGubU_g7WSORJhn_usFsbRaD-qm86rve1E,2746
|
|
212
213
|
letta/server/rest_api/routers/v1/llms.py,sha256=lYp5URXtZk1yu_Pe-p1Wq1uQ0qeb6aWtx78rXSB7N_E,881
|
|
213
214
|
letta/server/rest_api/routers/v1/organizations.py,sha256=8n-kA9LHtKImdY2xL-v7m6nYAbFWqH1vjBCJhQbv7Is,2077
|
|
214
|
-
letta/server/rest_api/routers/v1/providers.py,sha256=
|
|
215
|
-
letta/server/rest_api/routers/v1/runs.py,sha256=
|
|
216
|
-
letta/server/rest_api/routers/v1/sandbox_configs.py,sha256=
|
|
217
|
-
letta/server/rest_api/routers/v1/sources.py,sha256=
|
|
218
|
-
letta/server/rest_api/routers/v1/steps.py,sha256=
|
|
219
|
-
letta/server/rest_api/routers/v1/tags.py,sha256=
|
|
220
|
-
letta/server/rest_api/routers/v1/tools.py,sha256=
|
|
215
|
+
letta/server/rest_api/routers/v1/providers.py,sha256=qyZsNTXgLVsoLZoCVY4qaqiG34zCEVmRUP2Cn6maK_4,2949
|
|
216
|
+
letta/server/rest_api/routers/v1/runs.py,sha256=OhyB53q1HiFJCHtRGemfWw5y8cAWwZPxYSzkb1EUC6Y,6074
|
|
217
|
+
letta/server/rest_api/routers/v1/sandbox_configs.py,sha256=9hqnnMwJ3wCwO-Bezu3Xl8i3TDSIuInw3gSeHaKUXfE,8526
|
|
218
|
+
letta/server/rest_api/routers/v1/sources.py,sha256=rpQhaRHyzGUK43LX623L8BBLqL85HJ6fUYPMvI4k3kA,8434
|
|
219
|
+
letta/server/rest_api/routers/v1/steps.py,sha256=IpCQuxpS34-4Qpgdv0FQJO-SffkFkW-OaRjWHquB_1w,3136
|
|
220
|
+
letta/server/rest_api/routers/v1/tags.py,sha256=coydgvL6-9cuG2Hy5Ea7QY3inhTHlsf69w0tcZenBus,880
|
|
221
|
+
letta/server/rest_api/routers/v1/tools.py,sha256=qIpXzrjihQgEnoGeiKxEzaKmzHIVvBO0V_lR1ciBHZs,13147
|
|
221
222
|
letta/server/rest_api/routers/v1/users.py,sha256=G5DBHSkPfBgVHN2Wkm-rVYiLQAudwQczIq2Z3YLdbVo,2277
|
|
222
223
|
letta/server/rest_api/static_files.py,sha256=NG8sN4Z5EJ8JVQdj19tkFa9iQ1kBPTab9f_CUxd_u4Q,3143
|
|
223
|
-
letta/server/rest_api/utils.py,sha256=
|
|
224
|
+
letta/server/rest_api/utils.py,sha256=fsp5rojySucv3TSSaY9QQ5DUyE6GhxkyKg8rZQQhZVA,11980
|
|
224
225
|
letta/server/server.py,sha256=3TjO0sef8UeQc_0efCoPT6vGz7f673KDZHwd15qKW2Q,57384
|
|
225
226
|
letta/server/startup.sh,sha256=qEi6dQHJRzEzDIgnIODj-RYp-O1XstfFpc6cFLkUzVs,1576
|
|
226
227
|
letta/server/static_files/assets/index-048c9598.js,sha256=mR16XppvselwKCcNgONs4L7kZEVa4OEERm4lNZYtLSk,146819
|
|
@@ -235,20 +236,20 @@ letta/server/ws_api/interface.py,sha256=TWl9vkcMCnLsUtgsuENZ-ku2oMDA-OUTzLh_yNRo
|
|
|
235
236
|
letta/server/ws_api/protocol.py,sha256=5mDgpfNZn_kNwHnpt5Dsuw8gdNH298sgxTGed3etzYg,1836
|
|
236
237
|
letta/server/ws_api/server.py,sha256=cBSzf-V4zT1bL_0i54OTI3cMXhTIIxqjSRF8pYjk7fg,5835
|
|
237
238
|
letta/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
238
|
-
letta/services/agent_manager.py,sha256=
|
|
239
|
-
letta/services/block_manager.py,sha256=
|
|
239
|
+
letta/services/agent_manager.py,sha256=fiLhLgYh65LXGuzwsYD38oT3lfBhnyn6yK1uvY3DePg,55536
|
|
240
|
+
letta/services/block_manager.py,sha256=PkbiO59VimLyK6PolWR5O29uHxksCH6pP6K4Vkov3NA,5573
|
|
240
241
|
letta/services/helpers/agent_manager_helper.py,sha256=MexqAGoc2e8Bso4_hJhBR6qyiFXtiB2MiMMqL-ur1a0,11302
|
|
241
242
|
letta/services/helpers/tool_execution_helper.py,sha256=q8uSiQcX6VH_iNg5VNloZgC2JkH9lIOXBKCXYPx2Yac,6097
|
|
242
|
-
letta/services/identity_manager.py,sha256=
|
|
243
|
+
letta/services/identity_manager.py,sha256=iFkiEqY8Uik8Bzla53Qh1empZvfJug914xzIwWCO9ho,7144
|
|
243
244
|
letta/services/job_manager.py,sha256=y7P03ijWrOY1HzhphrRdeEPUQz-wHcNvoi-zrefjbuE,13155
|
|
244
|
-
letta/services/message_manager.py,sha256=
|
|
245
|
+
letta/services/message_manager.py,sha256=miGZ24h6NC16wHiTP95ooo-M-o2x1rxRnj67p8vQyOY,10702
|
|
245
246
|
letta/services/organization_manager.py,sha256=dhQ3cFPXWNYLfMjdahr2HsOAMJ1JtCEWj1G8Nei5MQc,3388
|
|
246
247
|
letta/services/passage_manager.py,sha256=mwShFO_xRaTi82fvANb_ngO0TmGaZPA9FPu8KuZ6Gd8,8643
|
|
247
248
|
letta/services/per_agent_lock_manager.py,sha256=porM0cKKANQ1FvcGXOO_qM7ARk5Fgi1HVEAhXsAg9-4,546
|
|
248
|
-
letta/services/provider_manager.py,sha256=
|
|
249
|
+
letta/services/provider_manager.py,sha256=QOKMSZOM6eAWa2-nANWQc1frKBh8N3gqDq0V87fnSuc,3748
|
|
249
250
|
letta/services/sandbox_config_manager.py,sha256=AlZFtESHfEQf3T6WEpn7-B4nZgmnoO_-FxB5FCxSqpY,13357
|
|
250
251
|
letta/services/source_manager.py,sha256=SE24AiPPhpvZMGDD047H3_ZDD7OM4zHbTW1JXjPEv7U,7672
|
|
251
|
-
letta/services/step_manager.py,sha256=
|
|
252
|
+
letta/services/step_manager.py,sha256=svDP_Mv64iIJKzYDFlDT5fabmWBvyjPPa0FIN--L7u0,5000
|
|
252
253
|
letta/services/tool_execution_sandbox.py,sha256=mev4oCHy4B_uoXRccTirDNp_pSX_s5wbUVNz1oKrvBU,22067
|
|
253
254
|
letta/services/tool_manager.py,sha256=Q-J8mZKw3zi5Ymxy48DiwpOcv1s6rqdSkRHE6pbnzKk,9568
|
|
254
255
|
letta/services/user_manager.py,sha256=ScHbdJK9kNF8QXjsd3ZWGEL87n_Uyp3YwfKetOJmpHs,4304
|
|
@@ -258,8 +259,8 @@ letta/streaming_utils.py,sha256=jLqFTVhUL76FeOuYk8TaRQHmPTf3HSRc2EoJwxJNK6U,1194
|
|
|
258
259
|
letta/system.py,sha256=dnOrS2FlRMwijQnOvfrky0Lg8wEw-FUq2zzfAJOUSKA,8477
|
|
259
260
|
letta/tracing.py,sha256=0uCH8j2ipTpS8Vt7bFl74sG5ckgBHy9fu-cyG9SBSsc,7464
|
|
260
261
|
letta/utils.py,sha256=AdHrQ2OQ3V4XhJ1LtYwbLUO71j2IJY37cIUxXPgaaRY,32125
|
|
261
|
-
letta_nightly-0.6.
|
|
262
|
-
letta_nightly-0.6.
|
|
263
|
-
letta_nightly-0.6.
|
|
264
|
-
letta_nightly-0.6.
|
|
265
|
-
letta_nightly-0.6.
|
|
262
|
+
letta_nightly-0.6.33.dev20250226015402.dist-info/LICENSE,sha256=mExtuZ_GYJgDEI38GWdiEYZizZS4KkVt2SF1g_GPNhI,10759
|
|
263
|
+
letta_nightly-0.6.33.dev20250226015402.dist-info/METADATA,sha256=5VX5KM-BAR4tlUoK4QcMfg7fy4ut2Yghy0dzl7O9CB8,22589
|
|
264
|
+
letta_nightly-0.6.33.dev20250226015402.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
|
265
|
+
letta_nightly-0.6.33.dev20250226015402.dist-info/entry_points.txt,sha256=2zdiyGNEZGV5oYBuS-y2nAAgjDgcC9yM_mHJBFSRt5U,40
|
|
266
|
+
letta_nightly-0.6.33.dev20250226015402.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|