fix: офлайн-режим для векторной памяти и исправление меню ИИ-чата

Исправления:
- Убран 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 <qwen-coder@alibabacloud.com>
This commit is contained in:
mirivlad 2026-02-24 22:54:09 +08:00
parent 77879e75a6
commit b90b4ed77d
3 changed files with 29 additions and 7 deletions

4
.gitignore vendored
View File

@ -23,6 +23,10 @@ bot_config.json
# Logs
*.log
# Cache
.cache/
huggingface_cache/
# OS
.DS_Store
Thumbs.db

17
bot.py
View File

@ -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,
@ -863,7 +870,10 @@ class MenuBuilder:
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"
# Показать текущую директорию и сервер
@ -1536,7 +1545,7 @@ async def menu_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
)
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}")

View File

@ -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