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:
parent
77879e75a6
commit
b90b4ed77d
|
|
@ -23,6 +23,10 @@ bot_config.json
|
||||||
# Logs
|
# Logs
|
||||||
*.log
|
*.log
|
||||||
|
|
||||||
|
# Cache
|
||||||
|
.cache/
|
||||||
|
huggingface_cache/
|
||||||
|
|
||||||
# OS
|
# OS
|
||||||
.DS_Store
|
.DS_Store
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
|
|
||||||
17
bot.py
17
bot.py
|
|
@ -28,6 +28,13 @@ MAX_MESSAGE_LENGTH = 4096 # Максимальная длина сообщен
|
||||||
import pexpect
|
import pexpect
|
||||||
import asyncssh
|
import asyncssh
|
||||||
from qwen_integration import qwen_manager, QwenSessionState
|
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 (
|
from vector_memory import (
|
||||||
hybrid_memory_manager,
|
hybrid_memory_manager,
|
||||||
save_message,
|
save_message,
|
||||||
|
|
@ -863,7 +870,10 @@ class MenuBuilder:
|
||||||
logger.info(f"get_keyboard: user_id={user_id}, ai_chat_mode={state.ai_chat_mode}")
|
logger.info(f"get_keyboard: user_id={user_id}, ai_chat_mode={state.ai_chat_mode}")
|
||||||
|
|
||||||
for item in items:
|
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 в зависимости от статуса
|
# Меняем текст кнопки и callback_data в зависимости от статуса
|
||||||
if state.ai_chat_mode:
|
if state.ai_chat_mode:
|
||||||
label = f"✅ Выключить чат с ИИ"
|
label = f"✅ Выключить чат с ИИ"
|
||||||
|
|
@ -1078,8 +1088,7 @@ async def menu_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||||
user = update.effective_user
|
user = update.effective_user
|
||||||
state = state_manager.get(user.id)
|
state = state_manager.get(user.id)
|
||||||
|
|
||||||
# Сброс состояния и возврат к главному меню
|
# Не сбрасываем состояние - сохраняем ai_chat_mode и другие настройки
|
||||||
state_manager.reset(user.id)
|
|
||||||
state.current_menu = "main"
|
state.current_menu = "main"
|
||||||
|
|
||||||
# Показать текущую директорию и сервер
|
# Показать текущую директорию и сервер
|
||||||
|
|
@ -1536,7 +1545,7 @@ async def menu_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||||
)
|
)
|
||||||
state.current_menu = "main"
|
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
|
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}")
|
logger.info(f"toggle_ai_chat: user_id={user_id}, new_mode={state.ai_chat_mode}")
|
||||||
|
|
|
||||||
|
|
@ -75,8 +75,17 @@ class VectorMemoryStorage:
|
||||||
def _get_embedding_model(self):
|
def _get_embedding_model(self):
|
||||||
"""Ленивая загрузка модели эмбеддингов."""
|
"""Ленивая загрузка модели эмбеддингов."""
|
||||||
if self._embedding_model is None:
|
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
|
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}")
|
logger.info(f"Модель эмбеддингов загружена: {self.model_name}")
|
||||||
return self._embedding_model
|
return self._embedding_model
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue