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 +4 -1
- letta/embeddings.py +6 -5
- letta/schemas/providers/ollama.py +42 -54
- {letta_nightly-0.11.0.dev20250808055434.dist-info → letta_nightly-0.11.0.dev20250808104456.dist-info}/METADATA +1 -1
- {letta_nightly-0.11.0.dev20250808055434.dist-info → letta_nightly-0.11.0.dev20250808104456.dist-info}/RECORD +8 -8
- {letta_nightly-0.11.0.dev20250808055434.dist-info → letta_nightly-0.11.0.dev20250808104456.dist-info}/LICENSE +0 -0
- {letta_nightly-0.11.0.dev20250808055434.dist-info → letta_nightly-0.11.0.dev20250808104456.dist-info}/WHEEL +0 -0
- {letta_nightly-0.11.0.dev20250808055434.dist-info → letta_nightly-0.11.0.dev20250808104456.dist-info}/entry_points.txt +0 -0
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
|
-
#
|
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/
|
144
|
+
# curl http://localhost:11434/v1/embeddings -d '{
|
144
145
|
# "model": "mxbai-embed-large",
|
145
|
-
# "
|
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, "
|
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}/
|
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
|
45
|
-
|
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
|
-
|
48
|
-
context_window =
|
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=
|
60
|
+
model=model_name,
|
52
61
|
model_endpoint_type=ProviderType.ollama,
|
53
|
-
model_endpoint=f"{self.base_url}{
|
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(
|
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
|
77
|
-
|
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
|
-
|
80
|
-
|
81
|
-
|
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=
|
103
|
+
embedding_model=model_name,
|
85
104
|
embedding_endpoint_type=ProviderType.ollama,
|
86
|
-
embedding_endpoint=f"{self.base_url}{
|
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(
|
108
|
+
handle=self.get_handle(model_name, is_embedding=True),
|
90
109
|
)
|
91
110
|
)
|
92
111
|
return configs
|
93
112
|
|
94
|
-
async def
|
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
|
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
|
@@ -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=
|
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=
|
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=
|
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.
|
460
|
-
letta_nightly-0.11.0.
|
461
|
-
letta_nightly-0.11.0.
|
462
|
-
letta_nightly-0.11.0.
|
463
|
-
letta_nightly-0.11.0.
|
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,,
|
File without changes
|
File without changes
|