From a13db1490b53054e6594a11648bc0dcbdf50be73 Mon Sep 17 00:00:00 2001 From: mirivlad Date: Wed, 25 Feb 2026 14:39:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=83=20/co?= =?UTF-8?q?mpact=20=D0=B2=20=D0=BC=D0=B5=D0=BD=D1=8E=20=D0=BF=D0=B0=D0=BC?= =?UTF-8?q?=D1=8F=D1=82=D0=B8=20=D0=98=D0=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлена кнопка '🔄 Компактификация' в меню memory_menu - Реализован callback handler для memory_compact - Компактификация запускается из меню с отображением прогресса - Исправление: команда /compact теперь доступна через меню Version: 0.5.3 Co-authored-by: Qwen-Coder --- bot/handlers/callbacks.py | 47 +++++++++++++++++++++++++++++++++++++++ bot/keyboards/menus.py | 1 + 2 files changed, 48 insertions(+) diff --git a/bot/handlers/callbacks.py b/bot/handlers/callbacks.py index 407daf7..bee81c8 100644 --- a/bot/handlers/callbacks.py +++ b/bot/handlers/callbacks.py @@ -479,3 +479,50 @@ async def menu_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): # Сбрасываем историю чата в состоянии state.ai_chat_history = [] + elif callback == "memory_compact": + # Вызываем команду /compact через send_message + await query.edit_message_text( + "🔄 **Запуск компактификации истории...**\n\n" + "_Сжатие старой истории в структурированный summary._\n" + "_Это может занять несколько секунд._", + parse_mode="Markdown" + ) + + # Получаем compactor и выполняем компактификацию + from bot.compaction import get_compactor + try: + compactor = get_compactor() + result = await compactor.compact() + + if result.success: + if result.messages_compressed > 0: + await query.edit_message_text( + f"✅ **Компактификация завершена!**\n\n" + f"📊 Сжато сообщений: `{result.messages_compressed}`\n" + f"📝 Длина summary: `{result.summary_length}` символов\n" + f"💾 Экономия токенов: ~`{result.tokens_saved}`\n\n" + f"_Summary автоматически используется в контексте диалога._", + parse_mode="Markdown", + reply_markup=menu_builder.get_keyboard("memory") + ) + else: + await query.edit_message_text( + "ℹ️ **Компактификация не требуется**\n\n" + "_Недостаточно сообщений для сжатия или summary уже актуален._", + parse_mode="Markdown", + reply_markup=menu_builder.get_keyboard("memory") + ) + else: + await query.edit_message_text( + f"⚠️ **Ошибка компактификации:**\n`{result.error}`", + parse_mode="Markdown", + reply_markup=menu_builder.get_keyboard("memory") + ) + except Exception as e: + logger.exception(f"Ошибка в memory_compact: {e}") + await query.edit_message_text( + f"⚠️ **Ошибка компактификации:**\n`{e}`", + parse_mode="Markdown", + reply_markup=menu_builder.get_keyboard("memory") + ) + diff --git a/bot/keyboards/menus.py b/bot/keyboards/menus.py index 61f1911..210117a 100644 --- a/bot/keyboards/menus.py +++ b/bot/keyboards/menus.py @@ -186,6 +186,7 @@ def init_menus(menu_builder: MenuBuilder): MenuItem("📋 Мой профиль", "memory_profile", icon="📋"), MenuItem("📊 Статистика", "memory_stats", icon="📊"), MenuItem("🗑️ Очистить историю", "memory_clear", icon="🗑️"), + MenuItem("🔄 Компактификация", "memory_compact", icon="🔄"), MenuItem("⬅️ Назад", "settings", icon="⬅️"), ] menu_builder.add_menu("memory", memory_menu)