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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: openvector_dev
3
- Version: 0.1.26
3
+ Version: 0.1.28
4
4
  Summary:
5
5
  Author: p00ler
6
6
  Author-email: liveitspain@gmail.com
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openvector_dev"
3
- version = "0.1.26"
3
+ version = "0.1.28"
4
4
  description = ""
5
5
  authors = [
6
6
  {name = "p00ler",email = "liveitspain@gmail.com"}
@@ -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._msg_no.get(key, 0) + 1
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
- log.debug(f'Summary requested {bot}:{user_id}')
146
- merged_text, used_ids = await self.long.merge_old_chunks(
147
- user_id=user_id, bot=bot, chunk_type="type0", n=self.merge_n
148
- )
149
- return merged_text, used_ids
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=4,
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
- curr_no = self._msg_no.get(key, 0) + 1
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)]