letta-nightly 0.5.4.dev20241121104201__py3-none-any.whl → 0.5.5.dev20241122170327__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.5.4"
1
+ __version__ = "0.5.5"
2
2
 
3
3
  # import clients
4
4
  from letta.client.client import LocalClient, RESTClient, create_client
letta/agent.py CHANGED
@@ -1208,6 +1208,30 @@ class Agent(BaseAgent):
1208
1208
  new_messages = [new_system_message_obj] + self._messages[1:] # swap index 0 (system)
1209
1209
  self._messages = new_messages
1210
1210
 
1211
+ def update_memory_blocks_from_db(self):
1212
+ for block in self.memory.to_dict()["memory"].values():
1213
+ if block.get("templates", False):
1214
+ # we don't expect to update shared memory blocks that
1215
+ # are templates. this is something we could update in the
1216
+ # future if we expect templates to change often.
1217
+ continue
1218
+ block_id = block.get("id")
1219
+
1220
+ # TODO: This is really hacky and we should probably figure out how to
1221
+ db_block = BlockManager().get_block_by_id(block_id=block_id, actor=self.user)
1222
+ if db_block is None:
1223
+ # this case covers if someone has deleted a shared block by interacting
1224
+ # with some other agent.
1225
+ # in that case we should remove this shared block from the agent currently being
1226
+ # evaluated.
1227
+ printd(f"removing block: {block_id=}")
1228
+ continue
1229
+ if not isinstance(db_block.value, str):
1230
+ printd(f"skipping block update, unexpected value: {block_id=}")
1231
+ continue
1232
+ # TODO: we may want to update which columns we're updating from shared memory e.g. the limit
1233
+ self.memory.update_block_value(label=block.get("label", ""), value=db_block.value)
1234
+
1211
1235
  def rebuild_memory(self, force=False, update_timestamp=True, ms: Optional[MetadataStore] = None):
1212
1236
  """Rebuilds the system message with the latest memory object and any shared memory block updates"""
1213
1237
  curr_system_message = self.messages[0] # this is the system + memory bank, not just the system prompt
@@ -1219,28 +1243,7 @@ class Agent(BaseAgent):
1219
1243
  return
1220
1244
 
1221
1245
  if ms:
1222
- for block in self.memory.to_dict()["memory"].values():
1223
- if block.get("templates", False):
1224
- # we don't expect to update shared memory blocks that
1225
- # are templates. this is something we could update in the
1226
- # future if we expect templates to change often.
1227
- continue
1228
- block_id = block.get("id")
1229
-
1230
- # TODO: This is really hacky and we should probably figure out how to
1231
- db_block = BlockManager().get_block_by_id(block_id=block_id, actor=self.user)
1232
- if db_block is None:
1233
- # this case covers if someone has deleted a shared block by interacting
1234
- # with some other agent.
1235
- # in that case we should remove this shared block from the agent currently being
1236
- # evaluated.
1237
- printd(f"removing block: {block_id=}")
1238
- continue
1239
- if not isinstance(db_block.value, str):
1240
- printd(f"skipping block update, unexpected value: {block_id=}")
1241
- continue
1242
- # TODO: we may want to update which columns we're updating from shared memory e.g. the limit
1243
- self.memory.update_block_value(label=block.get("label", ""), value=db_block.value)
1246
+ self.update_memory_blocks_from_db()
1244
1247
 
1245
1248
  # If the memory didn't update, we probably don't want to update the timestamp inside
1246
1249
  # For example, if we're doing a system prompt swap, this should probably be False
letta/client/client.py CHANGED
@@ -190,9 +190,6 @@ class AbstractClient(object):
190
190
  def load_langchain_tool(self, langchain_tool: "LangChainBaseTool", additional_imports_module_attr_map: dict[str, str] = None) -> Tool:
191
191
  raise NotImplementedError
192
192
 
193
- def load_crewai_tool(self, crewai_tool: "CrewAIBaseTool", additional_imports_module_attr_map: dict[str, str] = None) -> Tool:
194
- raise NotImplementedError
195
-
196
193
  def load_composio_tool(self, action: "ActionType") -> Tool:
197
194
  raise NotImplementedError
198
195
 
@@ -899,8 +896,8 @@ class RESTClient(AbstractClient):
899
896
  else:
900
897
  return Block(**response.json())
901
898
 
902
- def update_block(self, block_id: str, name: Optional[str] = None, text: Optional[str] = None) -> Block:
903
- request = BlockUpdate(id=block_id, template_name=name, value=text)
899
+ def update_block(self, block_id: str, name: Optional[str] = None, text: Optional[str] = None, limit: Optional[int] = None) -> Block:
900
+ request = BlockUpdate(id=block_id, template_name=name, value=text, limit=limit if limit else self.get_block(block_id).limit)
904
901
  response = requests.post(f"{self.base_url}/{self.api_prefix}/blocks/{block_id}", json=request.model_dump(), headers=self.headers)
905
902
  if response.status_code != 200:
906
903
  raise ValueError(f"Failed to update block: {response.text}")
@@ -2690,7 +2687,7 @@ class LocalClient(AbstractClient):
2690
2687
  Block(label=label, template_name=template_name, value=value, is_template=is_template), actor=self.user
2691
2688
  )
2692
2689
 
2693
- def update_block(self, block_id: str, name: Optional[str] = None, text: Optional[str] = None) -> Block:
2690
+ def update_block(self, block_id: str, name: Optional[str] = None, text: Optional[str] = None, limit: Optional[int] = None) -> Block:
2694
2691
  """
2695
2692
  Update a block
2696
2693
 
@@ -2703,7 +2700,9 @@ class LocalClient(AbstractClient):
2703
2700
  block (Block): Updated block
2704
2701
  """
2705
2702
  return self.server.block_manager.update_block(
2706
- block_id=block_id, block_update=BlockUpdate(template_name=name, value=text), actor=self.user
2703
+ block_id=block_id,
2704
+ block_update=BlockUpdate(template_name=name, value=text, limit=limit if limit else self.get_block(block_id).limit),
2705
+ actor=self.user,
2707
2706
  )
2708
2707
 
2709
2708
  def get_block(self, block_id: str) -> Block:
@@ -61,36 +61,6 @@ def {func_name}(**kwargs):
61
61
  return func_name, wrapper_function_str
62
62
 
63
63
 
64
- def generate_crewai_tool_wrapper(tool: "CrewAIBaseTool", additional_imports_module_attr_map: dict[str, str] = None) -> tuple[str, str]:
65
- tool_name = tool.__class__.__name__
66
- import_statement = f"from crewai_tools import {tool_name}"
67
- extra_module_imports = generate_import_code(additional_imports_module_attr_map)
68
-
69
- # Safety check that user has passed in all required imports:
70
- assert_all_classes_are_imported(tool, additional_imports_module_attr_map)
71
-
72
- tool_instantiation = f"tool = {generate_imported_tool_instantiation_call_str(tool)}"
73
- run_call = f"return tool._run(**kwargs)"
74
- func_name = humps.decamelize(tool_name)
75
-
76
- # Combine all parts into the wrapper function
77
- wrapper_function_str = f"""
78
- def {func_name}(**kwargs):
79
- if 'self' in kwargs:
80
- del kwargs['self']
81
- import importlib
82
- {import_statement}
83
- {extra_module_imports}
84
- {tool_instantiation}
85
- {run_call}
86
- """
87
-
88
- # Compile safety check
89
- assert_code_gen_compilable(wrapper_function_str)
90
-
91
- return func_name, wrapper_function_str
92
-
93
-
94
64
  def assert_code_gen_compilable(code_str):
95
65
  try:
96
66
  compile(code_str, "<string>", "exec")
@@ -98,9 +68,7 @@ def assert_code_gen_compilable(code_str):
98
68
  print(f"Syntax error in code: {e}")
99
69
 
100
70
 
101
- def assert_all_classes_are_imported(
102
- tool: Union["LangChainBaseTool", "CrewAIBaseTool"], additional_imports_module_attr_map: dict[str, str]
103
- ) -> None:
71
+ def assert_all_classes_are_imported(tool: Union["LangChainBaseTool"], additional_imports_module_attr_map: dict[str, str]) -> None:
104
72
  # Safety check that user has passed in all required imports:
105
73
  tool_name = tool.__class__.__name__
106
74
  current_class_imports = {tool_name}
@@ -114,7 +82,7 @@ def assert_all_classes_are_imported(
114
82
  raise RuntimeError(err_msg)
115
83
 
116
84
 
117
- def find_required_class_names_for_import(obj: Union["LangChainBaseTool", "CrewAIBaseTool", BaseModel]) -> list[str]:
85
+ def find_required_class_names_for_import(obj: Union["LangChainBaseTool", BaseModel]) -> list[str]:
118
86
  """
119
87
  Finds all the class names for required imports when instantiating the `obj`.
120
88
  NOTE: This does not return the full import path, only the class name.
@@ -202,10 +170,10 @@ def generate_imported_tool_instantiation_call_str(obj: Any) -> Optional[str]:
202
170
  else:
203
171
  # Otherwise, if it is none of the above, that usually means it is a custom Python class that is NOT a BaseModel
204
172
  # Thus, we cannot get enough information about it to stringify it
205
- # This may cause issues, but we are making the assumption that any of these custom Python types are handled correctly by the parent library, such as LangChain or CrewAI
173
+ # This may cause issues, but we are making the assumption that any of these custom Python types are handled correctly by the parent library, such as LangChain
206
174
  # An example would be that WikipediaAPIWrapper has an argument that is a wikipedia (pip install wikipedia) object
207
175
  # We cannot stringify this easily, but WikipediaAPIWrapper handles the setting of this parameter internally
208
- # This assumption seems fair to me, since usually they are external imports, and LangChain and CrewAI should be bundling those as module-level imports within the tool
176
+ # This assumption seems fair to me, since usually they are external imports, and LangChain should be bundling those as module-level imports within the tool
209
177
  # We throw a warning here anyway and provide the class name
210
178
  print(
211
179
  f"[WARNING] Skipping parsing unknown class {obj.__class__.__name__} (does not inherit from the Pydantic BaseModel and is not a basic Python type)"
@@ -219,10 +187,9 @@ def generate_imported_tool_instantiation_call_str(obj: Any) -> Optional[str]:
219
187
 
220
188
 
221
189
  def is_base_model(obj: Any):
222
- from crewai_tools.tools.base_tool import BaseModel as CrewAiBaseModel
223
190
  from langchain_core.pydantic_v1 import BaseModel as LangChainBaseModel
224
191
 
225
- return isinstance(obj, BaseModel) or isinstance(obj, LangChainBaseModel) or isinstance(obj, CrewAiBaseModel)
192
+ return isinstance(obj, BaseModel) or isinstance(obj, LangChainBaseModel)
226
193
 
227
194
 
228
195
  def generate_import_code(module_attr_map: Optional[dict]):
letta/schemas/tool.py CHANGED
@@ -4,13 +4,9 @@ from pydantic import Field
4
4
 
5
5
  from letta.functions.helpers import (
6
6
  generate_composio_tool_wrapper,
7
- generate_crewai_tool_wrapper,
8
7
  generate_langchain_tool_wrapper,
9
8
  )
10
- from letta.functions.schema_generator import (
11
- generate_schema_from_args_schema_v1,
12
- generate_schema_from_args_schema_v2,
13
- )
9
+ from letta.functions.schema_generator import generate_schema_from_args_schema_v2
14
10
  from letta.schemas.letta_base import LettaBase
15
11
  from letta.schemas.openai.chat_completions import ToolCall
16
12
 
@@ -132,37 +128,7 @@ class ToolCreate(LettaBase):
132
128
  tags = ["langchain"]
133
129
  # NOTE: langchain tools may come from different packages
134
130
  wrapper_func_name, wrapper_function_str = generate_langchain_tool_wrapper(langchain_tool, additional_imports_module_attr_map)
135
- json_schema = generate_schema_from_args_schema_v1(langchain_tool.args_schema, name=wrapper_func_name, description=description)
136
-
137
- return cls(
138
- name=wrapper_func_name,
139
- description=description,
140
- source_type=source_type,
141
- tags=tags,
142
- source_code=wrapper_function_str,
143
- json_schema=json_schema,
144
- )
145
-
146
- @classmethod
147
- def from_crewai(
148
- cls,
149
- crewai_tool: "CrewAIBaseTool",
150
- additional_imports_module_attr_map: dict[str, str] = None,
151
- ) -> "ToolCreate":
152
- """
153
- Class method to create an instance of Tool from a crewAI BaseTool object.
154
-
155
- Args:
156
- crewai_tool (CrewAIBaseTool): An instance of a crewAI BaseTool (BaseTool from crewai)
157
-
158
- Returns:
159
- Tool: A Letta Tool initialized with attributes derived from the provided crewAI BaseTool object.
160
- """
161
- description = crewai_tool.description
162
- source_type = "python"
163
- tags = ["crew-ai"]
164
- wrapper_func_name, wrapper_function_str = generate_crewai_tool_wrapper(crewai_tool, additional_imports_module_attr_map)
165
- json_schema = generate_schema_from_args_schema_v1(crewai_tool.args_schema, name=wrapper_func_name, description=description)
131
+ json_schema = generate_schema_from_args_schema_v2(langchain_tool.args_schema, name=wrapper_func_name, description=description)
166
132
 
167
133
  return cls(
168
134
  name=wrapper_func_name,
@@ -185,15 +151,6 @@ class ToolCreate(LettaBase):
185
151
 
186
152
  return [wikipedia_tool]
187
153
 
188
- @classmethod
189
- def load_default_crewai_tools(cls) -> List["ToolCreate"]:
190
- # For now, we only support scrape website tool
191
- from crewai_tools import ScrapeWebsiteTool
192
-
193
- web_scrape_tool = ToolCreate.from_crewai(ScrapeWebsiteTool())
194
-
195
- return [web_scrape_tool]
196
-
197
154
  @classmethod
198
155
  def load_default_composio_tools(cls) -> List["ToolCreate"]:
199
156
  from composio_langchain import Action
letta/server/server.py CHANGED
@@ -328,6 +328,15 @@ class SyncServer(Server):
328
328
  )
329
329
  )
330
330
 
331
+ def save_agents(self):
332
+ """Saves all the agents that are in the in-memory object store"""
333
+ for agent_d in self.active_agents:
334
+ try:
335
+ save_agent(agent_d["agent"], self.ms)
336
+ logger.info(f"Saved agent {agent_d['agent_id']}")
337
+ except Exception as e:
338
+ logger.exception(f"Error occurred while trying to save agent {agent_d['agent_id']}:\n{e}")
339
+
331
340
  def _get_agent(self, user_id: str, agent_id: str) -> Union[Agent, None]:
332
341
  """Get the agent object from the in-memory object store"""
333
342
  for d in self.active_agents:
@@ -1376,8 +1385,9 @@ class SyncServer(Server):
1376
1385
  # Get the agent object (loaded in memory)
1377
1386
  letta_agent = self._get_or_load_agent(agent_id=agent_id)
1378
1387
  assert isinstance(letta_agent.memory, Memory)
1379
- agent_state = letta_agent.agent_state.model_copy(deep=True)
1380
1388
 
1389
+ letta_agent.update_memory_blocks_from_db()
1390
+ agent_state = letta_agent.agent_state.model_copy(deep=True)
1381
1391
  # Load the tags in for the agent_state
1382
1392
  agent_state.tags = self.agents_tags_manager.get_tags_for_agent(agent_id=agent_id, actor=user)
1383
1393
  return agent_state
@@ -1723,7 +1733,7 @@ class SyncServer(Server):
1723
1733
  def add_default_external_tools(self, actor: User) -> bool:
1724
1734
  """Add default langchain tools. Return true if successful, false otherwise."""
1725
1735
  success = True
1726
- tool_creates = ToolCreate.load_default_langchain_tools() + ToolCreate.load_default_crewai_tools()
1736
+ tool_creates = ToolCreate.load_default_langchain_tools()
1727
1737
  if tool_settings.composio_api_key:
1728
1738
  tool_creates += ToolCreate.load_default_composio_tools()
1729
1739
  for tool_create in tool_creates:
@@ -34,7 +34,7 @@ class BlockManager:
34
34
  return block.to_pydantic()
35
35
 
36
36
  @enforce_types
37
- def update_block(self, block_id: str, block_update: BlockUpdate, actor: PydanticUser) -> PydanticBlock:
37
+ def update_block(self, block_id: str, block_update: BlockUpdate, actor: PydanticUser, limit: Optional[int] = None) -> PydanticBlock:
38
38
  """Update a block by its ID with the given BlockUpdate object."""
39
39
  with self.session_maker() as session:
40
40
  block = BlockModel.read(db_session=session, identifier=block_id, actor=actor)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: letta-nightly
3
- Version: 0.5.4.dev20241121104201
3
+ Version: 0.5.5.dev20241122170327
4
4
  Summary: Create LLM agents with long-term memory and custom tools
5
5
  License: Apache License
6
6
  Author: Letta Team
@@ -11,6 +11,7 @@ Classifier: Programming Language :: Python :: 3
11
11
  Classifier: Programming Language :: Python :: 3.10
12
12
  Classifier: Programming Language :: Python :: 3.11
13
13
  Classifier: Programming Language :: Python :: 3.12
14
+ Provides-Extra: all
14
15
  Provides-Extra: autogen
15
16
  Provides-Extra: dev
16
17
  Provides-Extra: external-tools
@@ -21,48 +22,46 @@ Provides-Extra: qdrant
21
22
  Provides-Extra: server
22
23
  Provides-Extra: tests
23
24
  Requires-Dist: alembic (>=1.13.3,<2.0.0)
24
- Requires-Dist: autoflake (>=2.3.0,<3.0.0) ; extra == "dev"
25
- Requires-Dist: black[jupyter] (>=24.2.0,<25.0.0) ; extra == "dev"
25
+ Requires-Dist: autoflake (>=2.3.0,<3.0.0) ; extra == "dev" or extra == "all"
26
+ Requires-Dist: black[jupyter] (>=24.2.0,<25.0.0) ; extra == "dev" or extra == "all"
26
27
  Requires-Dist: chromadb (>=0.4.24,<0.5.0)
27
- Requires-Dist: composio-core (>=0.5.34,<0.6.0) ; extra == "external-tools"
28
- Requires-Dist: composio-langchain (>=0.5.28,<0.6.0) ; extra == "external-tools"
29
- Requires-Dist: crewai (>=0.41.1,<0.42.0) ; extra == "external-tools"
30
- Requires-Dist: crewai-tools (>=0.8.3,<0.9.0) ; extra == "external-tools"
31
- Requires-Dist: datasets (>=2.14.6,<3.0.0) ; extra == "dev"
28
+ Requires-Dist: composio-core (>=0.5.34,<0.6.0) ; extra == "external-tools" or extra == "all"
29
+ Requires-Dist: composio-langchain (>=0.5.28,<0.6.0) ; extra == "external-tools" or extra == "all"
30
+ Requires-Dist: datasets (>=2.14.6,<3.0.0) ; extra == "dev" or extra == "all"
32
31
  Requires-Dist: demjson3 (>=3.0.6,<4.0.0)
33
- Requires-Dist: docker (>=7.1.0,<8.0.0) ; extra == "external-tools"
32
+ Requires-Dist: docker (>=7.1.0,<8.0.0) ; extra == "external-tools" or extra == "all"
34
33
  Requires-Dist: docstring-parser (>=0.16,<0.17)
35
34
  Requires-Dist: docx2txt (>=0.8,<0.9)
36
- Requires-Dist: fastapi (>=0.104.1,<0.105.0) ; extra == "server"
35
+ Requires-Dist: fastapi (>=0.104.1,<0.105.0) ; extra == "server" or extra == "all"
37
36
  Requires-Dist: html2text (>=2020.1.16,<2021.0.0)
38
37
  Requires-Dist: httpx (>=0.27.2,<0.28.0)
39
38
  Requires-Dist: httpx-sse (>=0.4.0,<0.5.0)
40
- Requires-Dist: isort (>=5.13.2,<6.0.0) ; extra == "dev"
39
+ Requires-Dist: isort (>=5.13.2,<6.0.0) ; extra == "dev" or extra == "all"
41
40
  Requires-Dist: jinja2 (>=3.1.4,<4.0.0)
42
- Requires-Dist: langchain (>=0.2.16,<0.3.0) ; extra == "external-tools"
43
- Requires-Dist: langchain-community (>=0.2.17,<0.3.0) ; extra == "external-tools"
41
+ Requires-Dist: langchain (>=0.3.7,<0.4.0) ; extra == "external-tools" or extra == "all"
42
+ Requires-Dist: langchain-community (>=0.3.7,<0.4.0) ; extra == "external-tools" or extra == "all"
44
43
  Requires-Dist: llama-index (>=0.11.9,<0.12.0)
45
- Requires-Dist: llama-index-embeddings-ollama (>=0.3.1,<0.4.0) ; extra == "ollama"
44
+ Requires-Dist: llama-index-embeddings-ollama (>=0.3.1,<0.4.0) ; extra == "ollama" or extra == "all"
46
45
  Requires-Dist: llama-index-embeddings-openai (>=0.2.5,<0.3.0)
47
- Requires-Dist: locust (>=2.31.5,<3.0.0)
46
+ Requires-Dist: locust (>=2.31.5,<3.0.0) ; extra == "dev" or extra == "all"
48
47
  Requires-Dist: nltk (>=3.8.1,<4.0.0)
49
48
  Requires-Dist: numpy (>=1.26.2,<2.0.0)
50
49
  Requires-Dist: pathvalidate (>=3.2.1,<4.0.0)
51
- Requires-Dist: pexpect (>=4.9.0,<5.0.0) ; extra == "dev"
52
- Requires-Dist: pg8000 (>=1.30.3,<2.0.0) ; extra == "postgres"
53
- Requires-Dist: pgvector (>=0.2.3,<0.3.0) ; extra == "postgres"
54
- Requires-Dist: pre-commit (>=3.5.0,<4.0.0) ; extra == "dev"
50
+ Requires-Dist: pexpect (>=4.9.0,<5.0.0) ; extra == "dev" or extra == "all"
51
+ Requires-Dist: pg8000 (>=1.30.3,<2.0.0) ; extra == "postgres" or extra == "all"
52
+ Requires-Dist: pgvector (>=0.2.3,<0.3.0) ; extra == "postgres" or extra == "all"
53
+ Requires-Dist: pre-commit (>=3.5.0,<4.0.0) ; extra == "dev" or extra == "all"
55
54
  Requires-Dist: prettytable (>=3.9.0,<4.0.0)
56
- Requires-Dist: psycopg2 (>=2.9.10,<3.0.0) ; extra == "postgres"
57
- Requires-Dist: psycopg2-binary (>=2.9.10,<3.0.0) ; extra == "postgres"
55
+ Requires-Dist: psycopg2 (>=2.9.10,<3.0.0) ; extra == "postgres" or extra == "all"
56
+ Requires-Dist: psycopg2-binary (>=2.9.10,<3.0.0) ; extra == "postgres" or extra == "all"
58
57
  Requires-Dist: pyautogen (==0.2.22) ; extra == "autogen"
59
58
  Requires-Dist: pydantic (>=2.7.4,<2.10.0)
60
59
  Requires-Dist: pydantic-settings (>=2.2.1,<3.0.0)
61
60
  Requires-Dist: pyhumps (>=3.8.0,<4.0.0)
62
61
  Requires-Dist: pymilvus (>=2.4.3,<3.0.0) ; extra == "milvus"
63
- Requires-Dist: pyright (>=1.1.347,<2.0.0) ; extra == "dev"
64
- Requires-Dist: pytest-asyncio (>=0.23.2,<0.24.0) ; extra == "dev"
65
- Requires-Dist: pytest-order (>=1.2.0,<2.0.0) ; extra == "dev"
62
+ Requires-Dist: pyright (>=1.1.347,<2.0.0) ; extra == "dev" or extra == "all"
63
+ Requires-Dist: pytest-asyncio (>=0.23.2,<0.24.0) ; extra == "dev" or extra == "all"
64
+ Requires-Dist: pytest-order (>=1.2.0,<2.0.0) ; extra == "dev" or extra == "all"
66
65
  Requires-Dist: python-box (>=7.1.1,<8.0.0)
67
66
  Requires-Dist: python-multipart (>=0.0.9,<0.0.10)
68
67
  Requires-Dist: pytz (>=2023.3.post1,<2024.0)
@@ -77,9 +76,9 @@ Requires-Dist: sqlmodel (>=0.0.16,<0.0.17)
77
76
  Requires-Dist: tiktoken (>=0.7.0,<0.8.0)
78
77
  Requires-Dist: tqdm (>=4.66.1,<5.0.0)
79
78
  Requires-Dist: typer[all] (>=0.9.0,<0.10.0)
80
- Requires-Dist: uvicorn (>=0.24.0.post1,<0.25.0) ; extra == "server"
81
- Requires-Dist: websockets (>=12.0,<13.0) ; extra == "server"
82
- Requires-Dist: wikipedia (>=1.4.0,<2.0.0) ; extra == "external-tools" or extra == "tests"
79
+ Requires-Dist: uvicorn (>=0.24.0.post1,<0.25.0) ; extra == "server" or extra == "all"
80
+ Requires-Dist: websockets (>=12.0,<13.0) ; extra == "server" or extra == "all"
81
+ Requires-Dist: wikipedia (>=1.4.0,<2.0.0) ; extra == "external-tools" or extra == "tests" or extra == "all"
83
82
  Description-Content-Type: text/markdown
84
83
 
85
84
  <p align="center">
@@ -1,6 +1,6 @@
1
- letta/__init__.py,sha256=lrj66PR9vRWLWUvQAgk4Qi8BebVsYk8J2poTTbuuBFQ,1014
1
+ letta/__init__.py,sha256=ipA7AF1PmUrwfj0xf_j3pB4IMe9wwRoX0yMzNU-Umos,1014
2
2
  letta/__main__.py,sha256=6Hs2PV7EYc5Tid4g4OtcLXhqVHiNYTGzSBdoOnW2HXA,29
3
- letta/agent.py,sha256=Jirt5D89k3s91nsScfjsOTfx3SS_eAOF8iQvZ0I3hjM,77421
3
+ letta/agent.py,sha256=7uc2v0mfAX46RdxPY-HIlfeO15mgBORfnr7bi84Ik4o,77430
4
4
  letta/agent_store/chroma.py,sha256=upR5zGnGs6I6btulEYbiZdGG87BgKjxUJOQZ4Y-RQ_M,12492
5
5
  letta/agent_store/db.py,sha256=dVBnNwVX57_kVdrD1oHnqze154QOoxWYSElJJUojyMs,23465
6
6
  letta/agent_store/lancedb.py,sha256=i63d4VZwj9UIOTNs5f0JZ_r5yZD-jKWz4FAH4RMpXOE,5104
@@ -13,7 +13,7 @@ letta/cli/cli.py,sha256=1dJIZ8DIGM8mg0G0UGLKMTa3fwgHzrN8Hkxd5Uxx7X4,16946
13
13
  letta/cli/cli_config.py,sha256=D-CpSZI1cDvdSQr3-zhGuDrJnZo1Ko7bi_wuxcBxxqo,8555
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=1eLqzAUKoO63Ee_p4LjJjrlqmv4phUZc2MPMXhPpEw0,98717
16
+ letta/client/client.py,sha256=Fx_3peTW88ycfscSb5DdSYzABWpliCcpDDr8Wd_bfTY,98751
17
17
  letta/client/streaming.py,sha256=Hh5pjlyrdCuO2V75ZCxSSOCPd3BmHdKFGaIUJC6fBp0,4775
18
18
  letta/client/utils.py,sha256=OJlAKWrldc4I6M1WpcTWNtPJ4wfxlzlZqWLfCozkFtI,2872
19
19
  letta/config.py,sha256=eK-ip06ELHNYriInkgfidDvJxQ2tD1u49I-VLXB87nE,18929
@@ -27,7 +27,7 @@ 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
29
  letta/functions/functions.py,sha256=VyA_7O56KRUj88iuMkLJTRfascaTCj1qFGT0BnDgC6k,4140
30
- letta/functions/helpers.py,sha256=JU3e5xkkTVx4EevBmtyCRnidf0ncAeASvH2ZT_aBvPc,9905
30
+ letta/functions/helpers.py,sha256=_GcgDLeR7YAGY0HIGxxM_EoXGFgWISZaX-FfS39nLGc,8682
31
31
  letta/functions/schema_generator.py,sha256=CoDZQfXsOKBp5VOv-024efcR833wyrchQbQIN7mL11A,8407
32
32
  letta/helpers/__init__.py,sha256=p0luQ1Oe3Skc6sH4O58aHHA3Qbkyjifpuq0DZ1GAY0U,59
33
33
  letta/helpers/tool_rule_solver.py,sha256=AZiUjW_oDlQx5uMI7oaL50KkI1InTW8qRkFdg6S54RQ,4744
@@ -152,7 +152,7 @@ letta/schemas/openai/openai.py,sha256=Hilo5BiLAGabzxCwnwfzK5QrWqwYD8epaEKFa4Pwnd
152
152
  letta/schemas/organization.py,sha256=d2oN3IK2HeruEHKXwIzCbJ3Fxdi_BEe9JZ8J9aDbHwQ,698
153
153
  letta/schemas/passage.py,sha256=eYQMxD_XjHAi72jmqcGBU4wM4VZtSU0XK8uhQxxN3Ug,3563
154
154
  letta/schemas/source.py,sha256=B1VbaDJV-EGPv1nQXwCx_RAzeAJd50UqP_1m1cIRT8c,2854
155
- letta/schemas/tool.py,sha256=HCUW4RXUS9RtvfpTPeNhauFN3s23BojSOceaIxv9bKI,9596
155
+ letta/schemas/tool.py,sha256=Ehdl4fB1tLG-kgUTVD7MAhvSs_H_Tim2aROu0S0diB8,8083
156
156
  letta/schemas/tool_rule.py,sha256=zv4jE0b8LW78idP4UbJARnrZcnmaqjGNUk_YV99Y0c0,884
157
157
  letta/schemas/usage.py,sha256=lvn1ooHwLEdv6gwQpw5PBUbcwn_gwdT6HA-fCiix6sY,817
158
158
  letta/schemas/user.py,sha256=V32Tgl6oqB3KznkxUz12y7agkQicjzW7VocSpj78i6Q,1526
@@ -185,7 +185,7 @@ letta/server/rest_api/routers/v1/tools.py,sha256=Bkb9oKswOycj5S3fBeim7LpDrZf37Sy
185
185
  letta/server/rest_api/routers/v1/users.py,sha256=M1wEr2IyHzuRwINYxLXTkrbAH3osLe_cWjzrWrzR1aw,3729
186
186
  letta/server/rest_api/static_files.py,sha256=NG8sN4Z5EJ8JVQdj19tkFa9iQ1kBPTab9f_CUxd_u4Q,3143
187
187
  letta/server/rest_api/utils.py,sha256=GdHYCzXtbM5VCAYDPR0z5gnNZpRhwPld2BGZV7xT6cU,2924
188
- letta/server/server.py,sha256=hYlHYb93kjgtBvnQ6RoRstA80wTRfsKpSECVQVkgR7s,77287
188
+ letta/server/server.py,sha256=sH1_y5PUFcpjsNZe2OiVx5OZooSom9akedr1qPW094Y,77721
189
189
  letta/server/startup.sh,sha256=wTOQOJJZw_Iec57WIu0UW0AVflk0ZMWYZWg8D3T_gSQ,698
190
190
  letta/server/static_files/assets/index-3ab03d5b.css,sha256=OrA9W4iKJ5h2Wlr7GwdAT4wow0CM8hVit1yOxEL49Qw,54295
191
191
  letta/server/static_files/assets/index-9fa459a2.js,sha256=j2oMcDJO9dWJaH5e-tsflbVpWK20gLWpZKJk4-Kuy6A,1815592
@@ -200,7 +200,7 @@ letta/server/ws_api/protocol.py,sha256=M_-gM5iuDBwa1cuN2IGNCG5GxMJwU2d3XW93XALv9
200
200
  letta/server/ws_api/server.py,sha256=C2Kv48PCwl46DQFb0ZP30s86KJLQ6dZk2AhWQEZn9pY,6004
201
201
  letta/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
202
202
  letta/services/agents_tags_manager.py,sha256=zNqeXDpaf4dQ77jrRHiQfITdk4FawBzcND-9tWrj8gw,3127
203
- letta/services/block_manager.py,sha256=usUbUzHjQXtJ0GLAGlCVl3RgZeEaPz7BGMCjiF_2X4k,4439
203
+ letta/services/block_manager.py,sha256=oxSeBTPILihcM65mZgvW9OD51z20wU232BFORxC-wlo,4468
204
204
  letta/services/organization_manager.py,sha256=OfE2_NMmhqXURX4sg7hCOiFQVQpV5ZiPu7J3sboCSYc,3555
205
205
  letta/services/source_manager.py,sha256=StX5Wfd7XSCKJet8qExIu3GMoI-eMIbEarAeTv2gq0s,6555
206
206
  letta/services/tool_manager.py,sha256=Vr2_JQ3TQUSPSPNbmGwY26HIFjYw0NhzJGgpMvS6GV8,8163
@@ -210,8 +210,8 @@ letta/streaming_interface.py,sha256=_FPUWy58j50evHcpXyd7zB1wWqeCc71NCFeWh_TBvnw,
210
210
  letta/streaming_utils.py,sha256=329fsvj1ZN0r0LpQtmMPZ2vSxkDBIUUwvGHZFkjm2I8,11745
211
211
  letta/system.py,sha256=buKYPqG5n2x41hVmWpu6JUpyd7vTWED9Km2_M7dLrvk,6960
212
212
  letta/utils.py,sha256=COwQLAt02eEM9tjp6p5kN8YeTqGXr714l5BvffLVCLU,32376
213
- letta_nightly-0.5.4.dev20241121104201.dist-info/LICENSE,sha256=mExtuZ_GYJgDEI38GWdiEYZizZS4KkVt2SF1g_GPNhI,10759
214
- letta_nightly-0.5.4.dev20241121104201.dist-info/METADATA,sha256=NMAuQrVAjCVN75tHqdPuKoZh9xmwP9mOeOgQ3HbTfcg,11070
215
- letta_nightly-0.5.4.dev20241121104201.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
216
- letta_nightly-0.5.4.dev20241121104201.dist-info/entry_points.txt,sha256=2zdiyGNEZGV5oYBuS-y2nAAgjDgcC9yM_mHJBFSRt5U,40
217
- letta_nightly-0.5.4.dev20241121104201.dist-info/RECORD,,
213
+ letta_nightly-0.5.5.dev20241122170327.dist-info/LICENSE,sha256=mExtuZ_GYJgDEI38GWdiEYZizZS4KkVt2SF1g_GPNhI,10759
214
+ letta_nightly-0.5.5.dev20241122170327.dist-info/METADATA,sha256=J90RtHFQaC45m_vweNgH-iimhBIgn6u2oCLVIDh3GzM,11395
215
+ letta_nightly-0.5.5.dev20241122170327.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
216
+ letta_nightly-0.5.5.dev20241122170327.dist-info/entry_points.txt,sha256=2zdiyGNEZGV5oYBuS-y2nAAgjDgcC9yM_mHJBFSRt5U,40
217
+ letta_nightly-0.5.5.dev20241122170327.dist-info/RECORD,,