openvector_dev 0.1.5__py3-none-any.whl → 0.1.7__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.
- lein_vector/api/facade.py +47 -37
- lein_vector/memory_manager_qdrant.py +1 -0
- lein_vector/sentence_transformer.py +2 -3
- {openvector_dev-0.1.5.dist-info → openvector_dev-0.1.7.dist-info}/METADATA +1 -1
- {openvector_dev-0.1.5.dist-info → openvector_dev-0.1.7.dist-info}/RECORD +6 -6
- {openvector_dev-0.1.5.dist-info → openvector_dev-0.1.7.dist-info}/WHEEL +0 -0
lein_vector/api/facade.py
CHANGED
@@ -7,6 +7,7 @@ import redis.asyncio as aioredis
|
|
7
7
|
from lein_vector import MemoryManagerQdrant, QdrantAdapter, RedisShortTermMemory
|
8
8
|
from lein_vector.schemas.chunk import Chunk, ChunkPayload
|
9
9
|
from lein_vector.sentence_transformer import EmbeddingProviderGemini
|
10
|
+
import warnings
|
10
11
|
|
11
12
|
|
12
13
|
class Memory:
|
@@ -23,6 +24,8 @@ class Memory:
|
|
23
24
|
self._msg_no: dict[int, int] = {}
|
24
25
|
self.merge_n = merge_n
|
25
26
|
|
27
|
+
self.score_threshold = 0.72
|
28
|
+
|
26
29
|
@classmethod
|
27
30
|
async def from_qdrant(
|
28
31
|
cls,
|
@@ -62,6 +65,11 @@ class Memory:
|
|
62
65
|
:param history_n: Размер окна кратковременной памяти.
|
63
66
|
:returns: Словарь с short_term и long_term сообщениями.
|
64
67
|
"""
|
68
|
+
warnings.warn(
|
69
|
+
"Заменили на низкоуровневые методы",
|
70
|
+
DeprecationWarning,
|
71
|
+
stacklevel=2
|
72
|
+
)
|
65
73
|
key = (user_id, bot)
|
66
74
|
curr_no = self._msg_no.get(key, 0) + 1
|
67
75
|
self._msg_no[key] = curr_no
|
@@ -100,6 +108,11 @@ class Memory:
|
|
100
108
|
:param history_n: Размер окна кратковременной памяти.
|
101
109
|
:returns: Данные short_term и long_term в формате OpenAI-совместимого вывода.
|
102
110
|
"""
|
111
|
+
warnings.warn(
|
112
|
+
"Заменили на низкоуровневые методы",
|
113
|
+
DeprecationWarning,
|
114
|
+
stacklevel=2
|
115
|
+
)
|
103
116
|
data = await self.step_user(user_id, bot, user_msg, topk=topk, history_n=history_n)
|
104
117
|
data["short_term"] = self._to_openai(data["short_term"])
|
105
118
|
data["long_term"] = self._chunk_texts(data["long_term"])
|
@@ -127,11 +140,12 @@ class Memory:
|
|
127
140
|
save_pair: bool = True,
|
128
141
|
):
|
129
142
|
"""
|
130
|
-
|
131
|
-
:param
|
132
|
-
:param
|
133
|
-
:param
|
134
|
-
:param
|
143
|
+
Добавляет в чанк памяти ответ ассистента.
|
144
|
+
:param user_id: Идентификатор пользователя
|
145
|
+
:param gf_msg: Сообщение от gf (assistant)
|
146
|
+
:param bot: Идентификатор бота
|
147
|
+
:param block_size: Размер блока для сохранения в долговременной памяти
|
148
|
+
:param save_pair: Флаг, сохранять ли пару сообщений при достижении block_size
|
135
149
|
"""
|
136
150
|
key = (user_id, bot)
|
137
151
|
curr_no = self._msg_no.get(key, 0) + 1
|
@@ -170,50 +184,46 @@ class Memory:
|
|
170
184
|
if curr_no % 40 == 0:
|
171
185
|
await self.long.merge_old_chunks(user_id, "type0", n=self.merge_n)
|
172
186
|
|
173
|
-
async def
|
174
|
-
"""
|
175
|
-
:param n: Количество последних сообщений кратковременной памяти.
|
176
|
-
:returns: Список сообщений.
|
177
|
-
"""
|
178
|
-
return await self.short.window(n)
|
179
|
-
|
180
|
-
async def _get_long_term(
|
181
|
-
self, user_id: int, embedding: list[float], topk: int = 3
|
182
|
-
) -> list:
|
183
|
-
"""
|
184
|
-
:param user_id: Идентификатор пользователя.
|
185
|
-
:param embedding: Вектор эмбеддинга для поиска.
|
186
|
-
:param topk: Количество возвращаемых чанков.
|
187
|
-
:returns: Список чанков.
|
187
|
+
async def get_long_memories(self, user_id: int, bot: str, search_terms: list[str], topk: int = 3) -> list:
|
188
188
|
"""
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
:param
|
194
|
-
:
|
195
|
-
:param topk: Количество возвращаемых чанков на запрос.
|
196
|
-
:returns: Список релевантных чанков.
|
189
|
+
Возвращает ТОЛЬКО длительную память по списку тем.
|
190
|
+
:param bot: Кодовое имя бота
|
191
|
+
:param user_id: Идентификатор пользователя
|
192
|
+
:param search_terms: Список поисковых запросов (строк)
|
193
|
+
:param topk: Количество возвращаемых чанков на запрос
|
194
|
+
:returns: Список релевантных чанков
|
197
195
|
"""
|
196
|
+
# wtf: Добавить фильтр только саммари
|
198
197
|
search_terms = [await self.embed.get_embedding(term) for term in search_terms]
|
199
|
-
return await self.long.retrieve_by_embeddings(user_id, search_terms, topk
|
198
|
+
return await self.long.retrieve_by_embeddings(user_id, search_terms, topk,
|
199
|
+
bot=bot, score_threshold=0.72, filter_={"chunk_type": "type1"})
|
200
200
|
|
201
|
-
async def
|
201
|
+
async def get_short_memories(self, user_id: int, bot: str, n_memories: int = 20) -> list:
|
202
202
|
"""
|
203
|
-
|
204
|
-
:param
|
203
|
+
Возвращает ТОЛЬКО кратковременную память по списку тем
|
204
|
+
:param bot: Кодовое имя бота
|
205
|
+
:param user_id: Идентификатор пользователя
|
206
|
+
:param n_memories: Количество последних сообщений кратковременной памяти
|
207
|
+
:returns: Список сообщений
|
205
208
|
"""
|
206
|
-
await self.short.
|
209
|
+
data = await self.short.window(user_id, bot, n_memories)
|
210
|
+
return self._to_openai(data)
|
207
211
|
|
208
|
-
async def
|
212
|
+
async def add_short_msg(self, user_id: int, bot: str, text: str, *, role: str = "user"):
|
209
213
|
"""
|
210
|
-
|
211
|
-
:param
|
214
|
+
Добавляет в "короткую память" новое сообщение
|
215
|
+
:param user_id: Идентификатор пользователя
|
216
|
+
:param bot: Кодовое имя бота
|
217
|
+
:param text: Сообщение для записи
|
218
|
+
:param role: Роль в диалоге
|
219
|
+
:type role: str = "user"
|
220
|
+
:return:
|
212
221
|
"""
|
213
|
-
await self.
|
222
|
+
await self.short.add(bot=bot, user_id=user_id, role=role, text=text)
|
214
223
|
|
215
224
|
async def delete_memory(self, user_id: int) -> None:
|
216
225
|
"""
|
226
|
+
Удаляет
|
217
227
|
:param user_id: Идентификатор пользователя.
|
218
228
|
"""
|
219
229
|
await self.long.delete_all(user_id)
|
@@ -144,6 +144,7 @@ class MemoryManagerQdrant(MemoryManagerABC):
|
|
144
144
|
async def retrieve_filtered(
|
145
145
|
self, user_id: int, bot: str, filter_: dict[str, Any], topk: int = 10
|
146
146
|
) -> list[ChunkPayload]:
|
147
|
+
raise NotImplementedError
|
147
148
|
q_filter = {"user_id": user_id, "bot": bot}
|
148
149
|
q_filter.update(filter_)
|
149
150
|
return await self.qdrant.get_all_chunks_with_filter(q_filter, topk=topk)
|
@@ -22,11 +22,10 @@ class EmbeddingProviderGemini(EmbeddingProviderABC):
|
|
22
22
|
async def get_embedding(self, text: str) -> list[float]:
|
23
23
|
# В Gemini SDK обычно нет async, значит — обёртка через run_in_executor:
|
24
24
|
import asyncio
|
25
|
-
|
25
|
+
if not isinstance(text, str):
|
26
|
+
return
|
26
27
|
loop = asyncio.get_running_loop()
|
27
|
-
# SDK call внутри executor
|
28
28
|
embedding = await loop.run_in_executor(None, lambda: self._genai_embed(text))
|
29
|
-
# Ответ — dict с 'embedding' или 'values'
|
30
29
|
return embedding.embeddings[0].values
|
31
30
|
|
32
31
|
async def get_embeddings(self, texts: list[str]) -> list[list[float]]:
|
@@ -1,17 +1,17 @@
|
|
1
1
|
lein_vector/__init__.py,sha256=ieXy65X4eVzUtSHNvlh00s4aMwKReafNni4s2q68z3Q,496
|
2
2
|
lein_vector/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
|
-
lein_vector/api/facade.py,sha256=
|
3
|
+
lein_vector/api/facade.py,sha256=f0Cwib5maw4Ae9QEmc5xDkx4Y2ozIzDQUqJ7jOdg2pg,10634
|
4
4
|
lein_vector/bases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
5
5
|
lein_vector/bases/embeding_provider_abc.py,sha256=WBpVC6ra-SYqhJeZs8R8U679wfGebXgwOOVPIii-IvY,265
|
6
6
|
lein_vector/bases/memory_manager_abc.py,sha256=pWuIw_wYlvUlt40jbiE92lWzdYaowZKg3XK0Mq0tQrw,1687
|
7
|
-
lein_vector/memory_manager_qdrant.py,sha256=
|
7
|
+
lein_vector/memory_manager_qdrant.py,sha256=gbOyXl3bm3H5EfvStOC6n4sWD85i8zWe97iKp6AvPDw,6175
|
8
8
|
lein_vector/memory_manager_ram.py,sha256=lUATu6U-cZuRHnR6U1L8aJQB8FNK0Wi40vXsZ5fjDgI,6002
|
9
9
|
lein_vector/qdrant_adapter.py,sha256=uPhYAp0KmYQhY3DF29JMO1JTbM__xDWGlnZZPor3VKI,4193
|
10
10
|
lein_vector/redis_short_term.py,sha256=uCcncjgXAlNAY46b3_Pjvrn_G0NEI16kRRR9hxayzak,3155
|
11
11
|
lein_vector/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
12
|
lein_vector/schemas/chunk.py,sha256=FSUwaFUSZk2ptoxupsdIfj5HYAMnHnu3eBfNpXCUMpM,1195
|
13
|
-
lein_vector/sentence_transformer.py,sha256=
|
13
|
+
lein_vector/sentence_transformer.py,sha256=gbWtkT01QFFA0IR_Ta-xsfBfb6owDzGnZDKY1g9fvBQ,1851
|
14
14
|
lein_vector/short_term.py,sha256=KFot9r26d9TZYLscVT42V0NwufIQUkx-hftOe2p7qLU,1933
|
15
|
-
openvector_dev-0.1.
|
16
|
-
openvector_dev-0.1.
|
17
|
-
openvector_dev-0.1.
|
15
|
+
openvector_dev-0.1.7.dist-info/METADATA,sha256=jNE4MlXel9eZ0iNEIg-JaFdIcAOCqBdxVUdVlNoKBqE,3167
|
16
|
+
openvector_dev-0.1.7.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
|
17
|
+
openvector_dev-0.1.7.dist-info/RECORD,,
|
File without changes
|