From b90b4ed77d2298936ad5851b24c0058f733fb15d Mon Sep 17 00:00:00 2001 From: mirivlad Date: Tue, 24 Feb 2026 22:54:09 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=BE=D1=84=D0=BB=D0=B0=D0=B9=D0=BD-?= =?UTF-8?q?=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=20=D0=B4=D0=BB=D1=8F=20=D0=B2?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=BD=D0=BE=D0=B9=20=D0=BF=D0=B0?= =?UTF-8?q?=D0=BC=D1=8F=D1=82=D0=B8=20=D0=B8=20=D0=B8=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=8E=20=D0=98=D0=98-=D1=87=D0=B0=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправления: - Убран state_manager.reset() в menu_command — сохраняет ai_chat_mode - Добавлен callback 'toggle_ai_chat' в обработчик кнопки ИИ - Исправлено условие в get_keyboard для кнопок _on/_off - Отключена проверка HuggingFace при загрузке модели (offline режим) - Подавлены логи sentence_transformers, huggingface_hub, httpx - Добавлен .cache/ в .gitignore Теперь: - Модель all-MiniLM-L6-v2 загружается из кэша (~88MB) - Никаких запросов к HF при запуске - Кнопка ИИ-чата корректно переключается - Состояние ai_chat_mode сохраняется при вызове меню Version: 0.3.1 Co-authored-by: Qwen-Coder --- .gitignore | 4 ++++ bot.py | 21 +++++++++++++++------ vector_memory.py | 11 ++++++++++- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 2f6da24..64457e8 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,10 @@ bot_config.json # Logs *.log +# Cache +.cache/ +huggingface_cache/ + # OS .DS_Store Thumbs.db diff --git a/bot.py b/bot.py index 869185a..58d293c 100644 --- a/bot.py +++ b/bot.py @@ -28,6 +28,13 @@ MAX_MESSAGE_LENGTH = 4096 # Максимальная длина сообщен import pexpect import asyncssh from qwen_integration import qwen_manager, QwenSessionState + +# Подавляем логи sentence-transformers и huggingface +import logging +logging.getLogger("sentence_transformers").setLevel(logging.WARNING) +logging.getLogger("huggingface_hub").setLevel(logging.WARNING) +logging.getLogger("httpx").setLevel(logging.WARNING) + from vector_memory import ( hybrid_memory_manager, save_message, @@ -861,9 +868,12 @@ class MenuBuilder: if state is None: state = state_manager.get(user_id) logger.info(f"get_keyboard: user_id={user_id}, ai_chat_mode={state.ai_chat_mode}") - + for item in items: - if item.callback == "toggle_ai_chat": + # Проверяем базовый callback и его варианты с _on/_off + is_ai_toggle = item.callback in ["toggle_ai_chat", "toggle_ai_chat_on", "toggle_ai_chat_off"] + + if is_ai_toggle: # Меняем текст кнопки и callback_data в зависимости от статуса if state.ai_chat_mode: label = f"✅ Выключить чат с ИИ" @@ -1078,8 +1088,7 @@ async def menu_command(update: Update, context: ContextTypes.DEFAULT_TYPE): user = update.effective_user state = state_manager.get(user.id) - # Сброс состояния и возврат к главному меню - state_manager.reset(user.id) + # Не сбрасываем состояние - сохраняем ai_chat_mode и другие настройки state.current_menu = "main" # Показать текущую директорию и сервер @@ -1535,8 +1544,8 @@ async def menu_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): reply_markup=menu_builder.get_keyboard("main", user_id=query.from_user.id, state=state) ) state.current_menu = "main" - - elif callback in ["toggle_ai_chat_on", "toggle_ai_chat_off"]: + + elif callback in ["toggle_ai_chat", "toggle_ai_chat_on", "toggle_ai_chat_off"]: # Переключаем режим чата с ИИ state.ai_chat_mode = not state.ai_chat_mode logger.info(f"toggle_ai_chat: user_id={user_id}, new_mode={state.ai_chat_mode}") diff --git a/vector_memory.py b/vector_memory.py index 7f55cf6..7ed3799 100644 --- a/vector_memory.py +++ b/vector_memory.py @@ -75,8 +75,17 @@ class VectorMemoryStorage: def _get_embedding_model(self): """Ленивая загрузка модели эмбеддингов.""" if self._embedding_model is None: + import os + # Отключаем проверку обновлений на HuggingFace + os.environ["TRANSFORMERS_OFFLINE"] = "1" + os.environ["HF_HUB_OFFLINE"] = "1" + from sentence_transformers import SentenceTransformer - self._embedding_model = SentenceTransformer(self.model_name) + # local_files_only=True — загружать только из кэша + self._embedding_model = SentenceTransformer( + self.model_name, + local_files_only=True + ) logger.info(f"Модель эмбеддингов загружена: {self.model_name}") return self._embedding_model