letta-nightly 0.11.0.dev20250808055434__py3-none-any.whl → 0.11.0.dev20250808104456__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.
letta/constants.py CHANGED
@@ -10,6 +10,7 @@ DEFAULT_TIMEZONE = "UTC"
10
10
 
11
11
  ADMIN_PREFIX = "/v1/admin"
12
12
  API_PREFIX = "/v1"
13
+ OLLAMA_API_PREFIX = "/v1"
13
14
  OPENAI_API_PREFIX = "/openai"
14
15
 
15
16
  COMPOSIO_ENTITY_ENV_VAR_KEY = "COMPOSIO_ENTITY"
@@ -50,8 +51,9 @@ TOOL_CALL_ID_MAX_LEN = 29
50
51
  # Max steps for agent loop
51
52
  DEFAULT_MAX_STEPS = 50
52
53
 
53
- # minimum context window size
54
+ # context window size
54
55
  MIN_CONTEXT_WINDOW = 4096
56
+ DEFAULT_CONTEXT_WINDOW = 32000
55
57
 
56
58
  # number of concurrent embedding requests to sent
57
59
  EMBEDDING_BATCH_SIZE = 200
@@ -63,6 +65,7 @@ DEFAULT_MIN_MESSAGE_BUFFER_LENGTH = 15
63
65
  # embeddings
64
66
  MAX_EMBEDDING_DIM = 4096 # maximum supported embeding size - do NOT change or else DBs will need to be reset
65
67
  DEFAULT_EMBEDDING_CHUNK_SIZE = 300
68
+ DEFAULT_EMBEDDING_DIM = 1024
66
69
 
67
70
  # tokenizers
68
71
  EMBEDDING_TO_TOKENIZER_MAP = {
letta/embeddings.py CHANGED
@@ -139,10 +139,11 @@ class AzureOpenAIEmbedding:
139
139
 
140
140
  class OllamaEmbeddings:
141
141
 
142
+ # Uses OpenAI API standard
142
143
  # Format:
143
- # curl http://localhost:11434/api/embeddings -d '{
144
+ # curl http://localhost:11434/v1/embeddings -d '{
144
145
  # "model": "mxbai-embed-large",
145
- # "prompt": "Llamas are members of the camelid family"
146
+ # "input": "Llamas are members of the camelid family"
146
147
  # }'
147
148
 
148
149
  def __init__(self, model: str, base_url: str, ollama_additional_kwargs: dict):
@@ -154,18 +155,18 @@ class OllamaEmbeddings:
154
155
  import httpx
155
156
 
156
157
  headers = {"Content-Type": "application/json"}
157
- json_data = {"model": self.model, "prompt": text}
158
+ json_data = {"model": self.model, "input": text}
158
159
  json_data.update(self.ollama_additional_kwargs)
159
160
 
160
161
  with httpx.Client() as client:
161
162
  response = client.post(
162
- f"{self.base_url}/api/embeddings",
163
+ f"{self.base_url}/embeddings",
163
164
  headers=headers,
164
165
  json=json_data,
165
166
  )
166
167
 
167
168
  response_json = response.json()
168
- return response_json["embedding"]
169
+ return response_json["data"][0]["embedding"]
169
170
 
170
171
 
171
172
  class GoogleEmbeddings:
@@ -3,7 +3,7 @@ from typing import Literal
3
3
  import aiohttp
4
4
  from pydantic import Field
5
5
 
6
- from letta.constants import DEFAULT_EMBEDDING_CHUNK_SIZE
6
+ from letta.constants import DEFAULT_EMBEDDING_CHUNK_SIZE, DEFAULT_CONTEXT_WINDOW, DEFAULT_EMBEDDING_DIM, OLLAMA_API_PREFIX
7
7
  from letta.log import get_logger
8
8
  from letta.schemas.embedding_config import EmbeddingConfig
9
9
  from letta.schemas.enums import ProviderCategory, ProviderType
@@ -12,8 +12,6 @@ from letta.schemas.providers.openai import OpenAIProvider
12
12
 
13
13
  logger = get_logger(__name__)
14
14
 
15
- ollama_prefix = "/v1"
16
-
17
15
 
18
16
  class OllamaProvider(OpenAIProvider):
19
17
  """Ollama provider that uses the native /api/generate endpoint
@@ -41,19 +39,30 @@ class OllamaProvider(OpenAIProvider):
41
39
  response_json = await response.json()
42
40
 
43
41
  configs = []
44
- for model in response_json["models"]:
45
- context_window = await self._get_model_context_window(model["name"])
42
+ for model in response_json.get("models", []):
43
+ model_name = model["name"]
44
+ model_details = await self._get_model_details_async(model_name)
45
+ if not model_details or "completion" not in model_details.get("capabilities", []):
46
+ continue
47
+
48
+ context_window = None
49
+ model_info = model_details.get("model_info", {})
50
+ if architecture := model_info.get("general.architecture"):
51
+ if context_length := model_info.get(f"{architecture}.context_length"):
52
+ context_window = int(context_length)
53
+
46
54
  if context_window is None:
47
- print(f"Ollama model {model['name']} has no context window, using default 32000")
48
- context_window = 32000
55
+ logger.warning(f"Ollama model {model_name} has no context window, using default {DEFAULT_CONTEXT_WINDOW}")
56
+ context_window = DEFAULT_CONTEXT_WINDOW
57
+
49
58
  configs.append(
50
59
  LLMConfig(
51
- model=model["name"],
60
+ model=model_name,
52
61
  model_endpoint_type=ProviderType.ollama,
53
- model_endpoint=f"{self.base_url}{ollama_prefix}",
62
+ model_endpoint=f"{self.base_url}{OLLAMA_API_PREFIX}",
54
63
  model_wrapper=self.default_prompt_formatter,
55
64
  context_window=context_window,
56
- handle=self.get_handle(model["name"]),
65
+ handle=self.get_handle(model_name),
57
66
  provider_name=self.name,
58
67
  provider_category=self.provider_category,
59
68
  )
@@ -73,25 +82,36 @@ class OllamaProvider(OpenAIProvider):
73
82
  response_json = await response.json()
74
83
 
75
84
  configs = []
76
- for model in response_json["models"]:
77
- embedding_dim = await self._get_model_embedding_dim(model["name"])
85
+ for model in response_json.get("models", []):
86
+ model_name = model["name"]
87
+ model_details = await self._get_model_details_async(model_name)
88
+ if not model_details or "embedding" not in model_details.get("capabilities", []):
89
+ continue
90
+
91
+ embedding_dim = None
92
+ model_info = model_details.get("model_info", {})
93
+ if architecture := model_info.get("general.architecture"):
94
+ if embedding_length := model_info.get(f"{architecture}.embedding_length"):
95
+ embedding_dim = int(embedding_length)
96
+
78
97
  if not embedding_dim:
79
- print(f"Ollama model {model['name']} has no embedding dimension, using default 1024")
80
- # continue
81
- embedding_dim = 1024
98
+ logger.warning(f"Ollama model {model_name} has no embedding dimension, using default {DEFAULT_EMBEDDING_DIM}")
99
+ embedding_dim = DEFAULT_EMBEDDING_DIM
100
+
82
101
  configs.append(
83
102
  EmbeddingConfig(
84
- embedding_model=model["name"],
103
+ embedding_model=model_name,
85
104
  embedding_endpoint_type=ProviderType.ollama,
86
- embedding_endpoint=f"{self.base_url}{ollama_prefix}",
105
+ embedding_endpoint=f"{self.base_url}{OLLAMA_API_PREFIX}",
87
106
  embedding_dim=embedding_dim,
88
107
  embedding_chunk_size=DEFAULT_EMBEDDING_CHUNK_SIZE,
89
- handle=self.get_handle(model["name"], is_embedding=True),
108
+ handle=self.get_handle(model_name, is_embedding=True),
90
109
  )
91
110
  )
92
111
  return configs
93
112
 
94
- async def _get_model_context_window(self, model_name: str) -> int | None:
113
+ async def _get_model_details_async(self, model_name: str) -> dict | None:
114
+ """Get detailed information for a specific model from /api/show."""
95
115
  endpoint = f"{self.base_url}/api/show"
96
116
  payload = {"name": model_name}
97
117
 
@@ -102,39 +122,7 @@ class OllamaProvider(OpenAIProvider):
102
122
  error_text = await response.text()
103
123
  logger.warning(f"Failed to get model info for {model_name}: {response.status} - {error_text}")
104
124
  return None
105
-
106
- response_json = await response.json()
107
- model_info = response_json.get("model_info", {})
108
-
109
- if architecture := model_info.get("general.architecture"):
110
- if context_length := model_info.get(f"{architecture}.context_length"):
111
- return int(context_length)
112
-
125
+ return await response.json()
113
126
  except Exception as e:
114
- logger.warning(f"Failed to get model context window for {model_name} with error: {e}")
115
-
116
- return None
117
-
118
- async def _get_model_embedding_dim(self, model_name: str) -> int | None:
119
- endpoint = f"{self.base_url}/api/show"
120
- payload = {"name": model_name}
121
-
122
- try:
123
- async with aiohttp.ClientSession() as session:
124
- async with session.post(endpoint, json=payload) as response:
125
- if response.status != 200:
126
- error_text = await response.text()
127
- logger.warning(f"Failed to get model info for {model_name}: {response.status} - {error_text}")
128
- return None
129
-
130
- response_json = await response.json()
131
- model_info = response_json.get("model_info", {})
132
-
133
- if architecture := model_info.get("general.architecture"):
134
- if embedding_length := model_info.get(f"{architecture}.embedding_length"):
135
- return int(embedding_length)
136
-
137
- except Exception as e:
138
- logger.warning(f"Failed to get model embedding dimension for {model_name} with error: {e}")
139
-
140
- return None
127
+ logger.warning(f"Failed to get model details for {model_name} with error: {e}")
128
+ return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: letta-nightly
3
- Version: 0.11.0.dev20250808055434
3
+ Version: 0.11.0.dev20250808104456
4
4
  Summary: Create LLM agents with long-term memory and custom tools
5
5
  License: Apache License
6
6
  Author: Letta Team
@@ -16,12 +16,12 @@ letta/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  letta/client/streaming.py,sha256=UsDS_tDTsA3HgYryIDvGGmx_dWfnfQwtmEwLi4Z89Ik,4701
17
17
  letta/client/utils.py,sha256=VCGV-op5ZSmurd4yw7Vhf93XDQ0BkyBT8qsuV7EqfiU,2859
18
18
  letta/config.py,sha256=JFGY4TWW0Wm5fTbZamOwWqk5G8Nn-TXyhgByGoAqy2c,12375
19
- letta/constants.py,sha256=CIo3xpLsYr1EqYZJdrlDqPOoMmomtOlFYX4eV8uF-pk,15326
19
+ letta/constants.py,sha256=8bOs4Ya6ZQO3kCJFoc9rFJX-NW-FlMGduXq8DdkpZeM,15404
20
20
  letta/data_sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  letta/data_sources/connectors.py,sha256=V8mUgE3V6CX-CcOyvkPSQ_ZWP2VtuqgTEXkCN1j0p68,7920
22
22
  letta/data_sources/connectors_helper.py,sha256=oQpVlc-BjSz9sTZ7sp4PsJSXJbBKpZPi3Dam03CURTQ,3376
23
23
  letta/data_sources/redis_client.py,sha256=Lz9hjJL9S7yd_qsvbuwqrGL3GwZe-qOc0uZm9FqNm4M,10688
24
- letta/embeddings.py,sha256=5bxVQOJHSXezbHH-htZDfzce_ZTEn_WY5E07PS09HO8,10555
24
+ letta/embeddings.py,sha256=WNSUAMEWLMDcQg_2iLap8ApmOnCT98JytnBHWuv_rCg,10590
25
25
  letta/errors.py,sha256=DiskTVZiSZ4jbjEBYw7TDvuslnYhcXSXX2LUzmMbydo,7632
26
26
  letta/functions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  letta/functions/ast_parsers.py,sha256=0dXAN4qx3pWL_Y0aoEkaBpMKwI-kpoLEJftjW3v2I4E,5031
@@ -290,7 +290,7 @@ letta/schemas/providers/groq.py,sha256=AquJQH-Y5-s75Nj2_X7xavuWUu5F2bSvHjAZ1Gfpe
290
290
  letta/schemas/providers/letta.py,sha256=50VcmTMm8OEQjZgdlLypa4QmNPe0mJycpZfbxxSb_ts,1611
291
291
  letta/schemas/providers/lmstudio.py,sha256=Hi8Nir96B5FCQ8cVT-mWl7nLX0Z2-RIxUANAqRGG-zo,4323
292
292
  letta/schemas/providers/mistral.py,sha256=EjFF6YcfN5jBjCfnZw3ECv_3qYuG0HVb7B0VoYk-jKU,1866
293
- letta/schemas/providers/ollama.py,sha256=iVx9xxrulG9ohbhk4kMtfryCnMgmynWg_NL4SesGX5U,6253
293
+ letta/schemas/providers/ollama.py,sha256=6uMKhK7lq_f9-k0oFNO7NDhBdpv57HxyjWlYTuuYYsE,5970
294
294
  letta/schemas/providers/openai.py,sha256=jlnMu3t1_IHWT4dGn8zZlbITl6wQl2X9onn_B2ZhV48,11051
295
295
  letta/schemas/providers/together.py,sha256=2zFca6Jy08r1ANrdvtlSIduyDr8ek9Tt1yYiz1S-5g8,3422
296
296
  letta/schemas/providers/vllm.py,sha256=CwM260cxWLkviVzY4wwkw4NmDAK69fv531AofRGa9JA,2480
@@ -456,8 +456,8 @@ letta/templates/summary_request_text.j2,sha256=ZttQwXonW2lk4pJLYzLK0pmo4EO4EtUUI
456
456
  letta/templates/template_helper.py,sha256=HkG3zwRc5NVGmSTQu5PUTpz7LevK43bzXVaQuN8urf0,1634
457
457
  letta/types/__init__.py,sha256=hokKjCVFGEfR7SLMrtZsRsBfsC7yTIbgKPLdGg4K1eY,147
458
458
  letta/utils.py,sha256=Fwwe2imHRamc_kucAATo8NXhwDG5NBoOIYmBaERXUhM,38384
459
- letta_nightly-0.11.0.dev20250808055434.dist-info/LICENSE,sha256=mExtuZ_GYJgDEI38GWdiEYZizZS4KkVt2SF1g_GPNhI,10759
460
- letta_nightly-0.11.0.dev20250808055434.dist-info/METADATA,sha256=oGIMFfhX6qRD55DEP_UdK596w0AMrKXiUlo-VWTAJfw,23281
461
- letta_nightly-0.11.0.dev20250808055434.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
462
- letta_nightly-0.11.0.dev20250808055434.dist-info/entry_points.txt,sha256=2zdiyGNEZGV5oYBuS-y2nAAgjDgcC9yM_mHJBFSRt5U,40
463
- letta_nightly-0.11.0.dev20250808055434.dist-info/RECORD,,
459
+ letta_nightly-0.11.0.dev20250808104456.dist-info/LICENSE,sha256=mExtuZ_GYJgDEI38GWdiEYZizZS4KkVt2SF1g_GPNhI,10759
460
+ letta_nightly-0.11.0.dev20250808104456.dist-info/METADATA,sha256=Z0sSJdcPjhEtwrK7ZZNPUc_fJm1Yyk3mf7-uMTHylHQ,23281
461
+ letta_nightly-0.11.0.dev20250808104456.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
462
+ letta_nightly-0.11.0.dev20250808104456.dist-info/entry_points.txt,sha256=2zdiyGNEZGV5oYBuS-y2nAAgjDgcC9yM_mHJBFSRt5U,40
463
+ letta_nightly-0.11.0.dev20250808104456.dist-info/RECORD,,