From 608860681002da545fe0a15a569cbbd77f3d32ee Mon Sep 17 00:00:00 2001 From: Kirill Kirilenko Date: Sun, 25 Jan 2026 00:02:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D1=81=D1=8B=D0=BB=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BE=D1=80=D0=B8=D0=B3=D0=B8=D0=BD=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80=D0=B8=20=D0=BE=D1=82=D0=B2?= =?UTF-8?q?=D0=B5=D1=82=D0=B5=20=D0=BD=D0=B0=20=D1=81=D0=BE=D0=BE=D0=B1?= =?UTF-8?q?=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B1=D0=BE=D1=82=D0=B0,=20?= =?UTF-8?q?=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D0=BE=D0=B5=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D1=8F=D0=B2=D0=BB=D1=8F=D0=B5=D1=82=D1=81=D1=8F=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D0=BB=D0=B5=D0=B4=D0=BD=D0=B8=D0=BC=20=D0=B2=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ai_agent.py | 3 +++ database.py | 26 ++++++++++++++------------ tg/handlers/default.py | 11 +++++++++++ vk/handlers/default.py | 12 ++++++++++++ 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/ai_agent.py b/ai_agent.py index c981a6a..d210b4c 100644 --- a/ai_agent.py +++ b/ai_agent.py @@ -109,6 +109,9 @@ class AiAgent: print(f"Ошибка выполнения запроса к ИИ: {e}") return f"Извините, при обработке запроса произошла ошибка.", False + def get_last_assistant_message_id(self, chat_id: int): + return self.db.context_get_last_assistant_message_id(chat_id) + def set_last_response_id(self, chat_id: int, message_id: int): self.db.context_set_last_message_id(chat_id, message_id) diff --git a/database.py b/database.py index 7a6fcf0..4d5b941 100644 --- a/database.py +++ b/database.py @@ -118,25 +118,27 @@ class BasicDatabase: self.cursor.execute("SELECT COUNT(*) FROM contexts WHERE chat_id = ?", chat_id) return self.cursor.fetchval() + def context_get_last_assistant_message_id(self, chat_id: int) -> Optional[int]: + return self.cursor.execute(""" + SELECT message_id FROM contexts + WHERE chat_id = ? AND role = 'assistant' AND message_id IS NOT NULL + ORDER BY message_id DESC + LIMIT 1 + """, chat_id).fetchval() + def context_add_message(self, chat_id: int, role: str, content: str, message_id: Optional[int], max_messages: int): self._context_trim(chat_id, max_messages) if message_id is not None: - self.cursor.execute(""" - INSERT INTO contexts (chat_id, message_id, role, content) - VALUES (?, ?, ?, ?) - """, chat_id, message_id, role, content) + self.cursor.execute("INSERT INTO contexts (chat_id, message_id, role, content) VALUES (?, ?, ?, ?)", + chat_id, message_id, role, content) else: - self.cursor.execute(""" - INSERT INTO contexts (chat_id, role, content) - VALUES (?, ?, ?) - """, chat_id, role, content) + self.cursor.execute("INSERT INTO contexts (chat_id, role, content) VALUES (?, ?, ?)", + chat_id, role, content) def context_set_last_message_id(self, chat_id: int, message_id: int): - self.cursor.execute(""" - UPDATE contexts SET message_id = ? - WHERE chat_id = ? AND message_id IS NULL - """, message_id, chat_id) + self.cursor.execute("UPDATE contexts SET message_id = ? WHERE chat_id = ? AND message_id IS NULL", + message_id, chat_id) def _context_trim(self, chat_id: int, max_messages: int): current_count = self.context_get_count(chat_id) diff --git a/tg/handlers/default.py b/tg/handlers/default.py index 0b7f0b3..027f068 100644 --- a/tg/handlers/default.py +++ b/tg/handlers/default.py @@ -81,6 +81,17 @@ async def any_message_handler(message: Message): else: await message.reply(MESSAGE_NOT_TEXT) return + + last_id = ai_agent.agent.get_last_assistant_message_id(chat_id) + if message.reply_to_message.message_id != last_id: + # Оригинального сообщения нет в контексте, или оно не последнее + if message.content_type == ContentType.TEXT: + ai_fwd_messages = [ + ai_agent.Message(user_name=await get_user_name_for_ai(message.reply_to_message.from_user), + text=message.reply_to_message.text)] + else: + await message.reply(MESSAGE_NOT_TEXT) + return else: return diff --git a/vk/handlers/default.py b/vk/handlers/default.py index b126f06..614e355 100644 --- a/vk/handlers/default.py +++ b/vk/handlers/default.py @@ -64,6 +64,18 @@ async def any_message_handler(message: Message): else: await message.reply(MESSAGE_NOT_TEXT) return + + last_id = ai_agent.agent.get_last_assistant_message_id(chat_id) + if message.reply_message.message_id != last_id: + # Оригинального сообщения нет в контексте, или оно не последнее + if len(message.reply_message.text) > 0: + ai_fwd_messages = [ + ai_agent.Message(user_name=await get_user_name_for_ai(message.ctx_api, + message.reply_message.from_id), + text=message.reply_message.text)] + else: + await message.reply(MESSAGE_NOT_TEXT) + return else: return