openvector_dev 0.1.26__tar.gz → 0.1.28__tar.gz
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.
- {openvector_dev-0.1.26 → openvector_dev-0.1.28}/PKG-INFO +1 -1
- {openvector_dev-0.1.26 → openvector_dev-0.1.28}/pyproject.toml +1 -1
- {openvector_dev-0.1.26 → openvector_dev-0.1.28}/src/lein_vector/api/facade.py +29 -11
- {openvector_dev-0.1.26 → openvector_dev-0.1.28}/src/lein_vector/redis_short_term.py +15 -0
- {openvector_dev-0.1.26 → openvector_dev-0.1.28}/README.md +0 -0
- {openvector_dev-0.1.26 → openvector_dev-0.1.28}/src/lein_vector/__init__.py +0 -0
- {openvector_dev-0.1.26 → openvector_dev-0.1.28}/src/lein_vector/api/__init__.py +0 -0
- {openvector_dev-0.1.26 → openvector_dev-0.1.28}/src/lein_vector/bases/__init__.py +0 -0
- {openvector_dev-0.1.26 → openvector_dev-0.1.28}/src/lein_vector/bases/embeding_provider_abc.py +0 -0
- {openvector_dev-0.1.26 → openvector_dev-0.1.28}/src/lein_vector/bases/memory_manager_abc.py +0 -0
- {openvector_dev-0.1.26 → openvector_dev-0.1.28}/src/lein_vector/memory_manager_qdrant.py +0 -0
- {openvector_dev-0.1.26 → openvector_dev-0.1.28}/src/lein_vector/memory_manager_ram.py +0 -0
- {openvector_dev-0.1.26 → openvector_dev-0.1.28}/src/lein_vector/qdrant_adapter.py +0 -0
- {openvector_dev-0.1.26 → openvector_dev-0.1.28}/src/lein_vector/schemas/__init__.py +0 -0
- {openvector_dev-0.1.26 → openvector_dev-0.1.28}/src/lein_vector/schemas/chunk.py +0 -0
- {openvector_dev-0.1.26 → openvector_dev-0.1.28}/src/lein_vector/sentence_transformer.py +0 -0
|
@@ -13,7 +13,7 @@ from lein_vector.sentence_transformer import EmbeddingProviderGemini
|
|
|
13
13
|
log = logging.getLogger(__name__)
|
|
14
14
|
|
|
15
15
|
class Memory:
|
|
16
|
-
def __init__(self, short_term, memory_manager, embedder, merge_n: int,
|
|
16
|
+
def __init__(self, short_term, memory_manager, embedder, redis_conn, merge_n: int,
|
|
17
17
|
gift_base: float, gift_growth: float, score_threshold: float):
|
|
18
18
|
"""
|
|
19
19
|
:param short_term: Кратковременное хранилище сообщений пользователя (RedisShortTermMemory).
|
|
@@ -25,6 +25,7 @@ class Memory:
|
|
|
25
25
|
self.long = memory_manager
|
|
26
26
|
self.embed = embedder
|
|
27
27
|
self._msg_no: dict[int, int] = {}
|
|
28
|
+
self.r = redis_conn
|
|
28
29
|
self.merge_n = merge_n
|
|
29
30
|
|
|
30
31
|
self._gift_base = gift_base
|
|
@@ -73,6 +74,7 @@ class Memory:
|
|
|
73
74
|
short_mem,
|
|
74
75
|
long_mem,
|
|
75
76
|
embedder,
|
|
77
|
+
redis_conn=_redis,
|
|
76
78
|
merge_n=merge_n,
|
|
77
79
|
gift_base=gift_base,
|
|
78
80
|
gift_growth=gift_growth,
|
|
@@ -109,8 +111,7 @@ class Memory:
|
|
|
109
111
|
:param save_pair: Флаг, сохранять ли пару сообщений при достижении block_size
|
|
110
112
|
"""
|
|
111
113
|
key = (user_id, bot)
|
|
112
|
-
curr_no = self.
|
|
113
|
-
self._msg_no[key] = curr_no
|
|
114
|
+
curr_no = await self.r.incr(f"msg_no:{bot}:{user_id}")
|
|
114
115
|
ts = datetime.now(UTC).timestamp()
|
|
115
116
|
await self.short.add(
|
|
116
117
|
bot=bot,
|
|
@@ -141,12 +142,17 @@ class Memory:
|
|
|
141
142
|
)
|
|
142
143
|
await self.long.upsert_chunk_with_vector(new_chunk, vector)
|
|
143
144
|
|
|
145
|
+
log.info(curr_no % (block_size * self.merge_n))
|
|
144
146
|
if curr_no % (block_size * self.merge_n) == 0:
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
147
|
+
try:
|
|
148
|
+
log.debug(f'Summary requested {bot}:{user_id}')
|
|
149
|
+
merged_text, used_ids = await self.long.merge_old_chunks(
|
|
150
|
+
user_id=user_id, bot=bot, chunk_type="type0", n=self.merge_n
|
|
151
|
+
)
|
|
152
|
+
return merged_text, used_ids
|
|
153
|
+
except:
|
|
154
|
+
log.error("Summary failed\n", exc_info=True)
|
|
155
|
+
return None, None
|
|
150
156
|
else:
|
|
151
157
|
return None, None
|
|
152
158
|
|
|
@@ -169,7 +175,7 @@ class Memory:
|
|
|
169
175
|
bot=bot,
|
|
170
176
|
embeddings=search_terms_embedded,
|
|
171
177
|
score_threshold=0.72,
|
|
172
|
-
topk=
|
|
178
|
+
topk=topk,
|
|
173
179
|
filter_={"chunk_type": "type1"},
|
|
174
180
|
)
|
|
175
181
|
|
|
@@ -209,8 +215,7 @@ class Memory:
|
|
|
209
215
|
|
|
210
216
|
key = (user_id, bot)
|
|
211
217
|
fails = self._gift_fail.get(key, 0)
|
|
212
|
-
|
|
213
|
-
self._msg_no[key] = curr_no
|
|
218
|
+
await self.r.incr(f"msg_no:{bot}:{user_id}")
|
|
214
219
|
|
|
215
220
|
p0, g = self._gift_base, self._gift_growth
|
|
216
221
|
p = min(1.0, p0 * (g**fails))
|
|
@@ -270,6 +275,19 @@ class Memory:
|
|
|
270
275
|
if old_chunks:
|
|
271
276
|
await self.long.delete_chunks(user_id, old_chunks)
|
|
272
277
|
|
|
278
|
+
async def drop_last_short(
|
|
279
|
+
self, user_id: int, bot: str, n: int = 2
|
|
280
|
+
) -> list[dict]:
|
|
281
|
+
"""
|
|
282
|
+
Удалить N последних сообщений из short-term и вернуть их содержимое.
|
|
283
|
+
Пригодится, если нужно «отмотать» историю.
|
|
284
|
+
"""
|
|
285
|
+
removed = await self.short.pop_last(user_id=user_id, bot=bot, n=n)
|
|
286
|
+
# счётчик сообщений, чтобы merge-триггер продолжал работать
|
|
287
|
+
if removed:
|
|
288
|
+
await self.r.decrby(f"msg_no:{bot}:{user_id}", len(removed))
|
|
289
|
+
return removed
|
|
290
|
+
|
|
273
291
|
async def delete_memory(self, user_id: int, bot: str) -> None:
|
|
274
292
|
"""
|
|
275
293
|
Полная очистка памяти данного (user_id, bot):
|
|
@@ -90,3 +90,18 @@ class RedisShortTermMemory:
|
|
|
90
90
|
return None
|
|
91
91
|
raw = await self.r.lrange(self._key(user_id, bot=bot), -chunk_size, -1)
|
|
92
92
|
return [self._load(r) for r in raw]
|
|
93
|
+
|
|
94
|
+
async def pop_last(self, user_id: int, bot: str, n: int = 2) -> list[dict]:
|
|
95
|
+
"""
|
|
96
|
+
Снять (и вернуть) N последних сообщений (по-умолчанию 2).
|
|
97
|
+
Если сообщений меньше – вернёт всё оставшееся.
|
|
98
|
+
"""
|
|
99
|
+
key = self._key(user_id, bot)
|
|
100
|
+
pipe = self.r.pipeline()
|
|
101
|
+
await pipe.rpop(key, n)
|
|
102
|
+
raw, = await pipe.execute()
|
|
103
|
+
if raw is None:
|
|
104
|
+
return []
|
|
105
|
+
if isinstance(raw, list):
|
|
106
|
+
return [self._load(x) for x in raw[::-1]]
|
|
107
|
+
return [self._load(raw)]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openvector_dev-0.1.26 → openvector_dev-0.1.28}/src/lein_vector/bases/embeding_provider_abc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|