Files
trueconf_bot/config/config.py
T

220 lines
13 KiB
Python

# /opt/trueconf_bot/config/config.py
import os
import sys
# Автоматическое определение корневой директории проекта (на уровень выше папки config)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# =========================================================
# ФУНКЦИЯ ЧТЕНИЯ .env
# =========================================================
# Загружает переменные окружения из локального файла .env (если он существует)
ENV_PATH = os.path.join(os.path.dirname(__file__), ".env")
def load_env(filepath):
try:
with open(filepath, "r", encoding="utf-8") as f:
for line in f:
line = line.strip()
if line and not line.startswith("#"):
if "=" in line:
key, value = line.split("=", 1)
os.environ[key.strip()] = value.strip(' "\'\r\n')
except FileNotFoundError:
print(f"⚠️ Файл {filepath} не найден. Используются системные переменные.")
load_env(ENV_PATH)
# Карта соответствия: Имя переменной в боте -> Название карточки в сейфе (из локального .env)
# ИСПРАВЛЕНО: Перенесено выше для корректной передачи списка в модуль ретраев
CREDENTIALS_MAP = {
"TC_PASSWORD": os.getenv("PW_ID_TC", "").strip(' "\'\r\n'), # Получит "bot_tcs"
"SD_TOKEN": os.getenv("PW_ID_SD", "").strip(' "\'\r\n'), # Получит "sdesktoken"
"AD_PASSWORD": os.getenv("PW_ID_AD", "").strip(' "\'\r\n'), # Получит "AD"
"DB_PASSWORD": os.getenv("PW_ID_SQL", "").strip(' "\'\r\n'), # Получит "boss_base"
}
# =========================================================
# ИНТЕГРАЦИЯ С PASSWORK (Динамическая загрузка паролей)
# =========================================================
PASSWORK_DIR = "/opt/passwork"
if PASSWORK_DIR not in sys.path:
sys.path.insert(0, PASSWORK_DIR)
try:
from passwork import get_passwork_secrets
print("🔐 Обращение к модулю Passwork и выгрузка сейфа...")
# ИСПРАВЛЕНО: Пробрасываем список целевых карточек для потокобезопасного ожидания сессии
required_to_wait = [name for name in CREDENTIALS_MAP.values() if name]
passwork_pool = get_passwork_secrets(required_cards=required_to_wait)
except Exception as e:
print(f"❌ КРИТИЧЕСКАЯ ОШИБКА: Не удалось подключить модуль Passwork: {e}")
sys.exit(1)
print("🔐 Распределение секретов и логинов по модулям бота...")
for var_name, card_name in CREDENTIALS_MAP.items():
if not card_name:
print(f"⚠️ Внимание: Название карточки для {var_name} не найдено в .env")
continue
clean_card_name = card_name.strip(' "\'\r\n')
card_data = passwork_pool.get(clean_card_name)
if card_data is None:
print(f"❌ КРИТИЧЕСКАЯ ОШИБКА: Карточка с именем '{clean_card_name}' не найдена в сейфе Passwork!")
sys.exit(1)
# Динамически заполняем пароль/токен в глобальную область видимости config.py
globals()[var_name] = card_data["password"].strip(' "\'\r\n')
# ИСПРАВЛЕНО: Переведено на жесткое globals() назначение для исключения NameError во внешних модулях
if var_name == "TC_PASSWORD":
globals()["TC_LOGIN"] = card_data.get("login", "").strip(' "\'\r\n')
elif var_name == "AD_PASSWORD":
globals()["AD_USER"] = card_data.get("login", "").strip(' "\'\r\n')
elif var_name == "DB_PASSWORD":
globals()["DB_USER"] = card_data.get("login", "").strip(' "\'\r\n')
print(f" ✓ {var_name} и логин успешно загружены из карточки '{clean_card_name}'")
# =========================================================
# 1. ГЛОБАЛЬНЫЕ ФЛАГИ МОДУЛЕЙ
# =========================================================
ENABLE_SERVICE_DESK = True # Модуль создания заявок в техподдержку
ENABLE_PHOTO_BOT = True # Модуль обработки фото/сканов
ENABLE_TRANSCRIPTION = True # Модуль расшифровки голосовых сообщений (Whisper)
ENABLE_SEARCH_BOT = True # Модуль интеллектуального поиска по регламентам (RAG)
ENABLE_LK = True # Личный кабинет сотрудника (отпуска, расчетные листки, справки)
# =========================================================
# 2. КОНТРОЛЬ ДОСТУПА
# =========================================================
ENABLE_WHITELIST = True # Включить режим закрытого бета-тестирования
ALLOWED_USERS = [ # Список TrueConf ID разрешенных пользователей
"ds.krivochenko@tcs.sibcem.ru",
"mm.norenberg@tcs.sibcem.ru",
"a.kirpichev@tcs.sibcem.ru"
]
# =========================================================
# 3. НАСТРОЙКИ СВЯЗИ С КОРПОРАТИВНЫМИ СИСТЕМАМИ
# =========================================================
TC_SERVER = os.getenv("TC_SERVER", "") # Адрес сервера TrueConf
AD_SERVER = "ldap://172.16.20.20" # Адрес контроллера домена Active Directory
AD_BASE = "OU=-Пользователи,DC=sibcem,DC=ru" # Базовый путь поиска пользователей в AD
SQL_SERVER = "SRVKEM-MOBILEIN.sibcem.ru" # Сервер MS SQL для работы Личного кабинета
SQL_DB_NAME = "BossCopy" # База данных с информацией по кадрам и ЗП
SD_URL = "https://servicedesk.sibcem.ru:8080" # URL портала ManageEngine ServiceDesk Plus
DEFAULT_REQUESTER = "ai@sibcem.ru" # E-mail по умолчанию для заявок
SMTP_SERVER = "srvkem-mail.sibcem.ru" # Corporate почтовый сервер
SMTP_PORT = 25 # Порт SMTP
DEFAULT_EMAIL_FROM = "ai@sibcem.ru" # Адрес отправителя системных писем бота
EMAIL_COOLDOWN_SEC = 10.0 # Кулдаун отправки критических алертов администратору
# Списки рассылок для системных уведомлений (берутся из .env, разделяются запятыми)
ALERTS_SUPPORT_EMAILS = [e.strip() for e in os.getenv("ALERTS_SUPPORT_EMAILS", "ds.krivochenko@sibcem.ru").split(",") if e.strip()]
ALERTS_DISABLED_USERS = [e.strip() for e in os.getenv("ALERTS_DISABLED_USERS", "").split(",") if e.strip()]
ALERTS_ALL_TICKETS = [e.strip() for e in os.getenv("ALERTS_ALL_TICKETS", "").split(",") if e.strip()]
# =========================================================
# 4. ВНЕШНИЕ МИКРОСЕРВИСЫ И ТАЙМАУТЫ СЕТИ
# =========================================================
TRASH_API_URL = os.getenv("TRASH_API_URL", "http://127.0.0.1:8000/upload")
TRANSCRIPTION_API_URL = "http://172.16.80.250:8000/"
API_HTTP_TIMEOUT = 30.0
# =========================================================
# 5. ИИ: ЯЗЫКОВАЯ МОДЕЛЬ (Генерация текста)
# =========================================================
# ИСПРАВЛЕНО: Добавлен суффикс .gguf для однозначной адресации модели в llama-server
OLLAMA_URL = "http://172.16.80.47:8080/v1/chat/completions"
OLLAMA_MODEL = "gemma-4-E4B-it-Q4_K_M.gguf"
AI_HTTP_TIMEOUT = 180.0
OLLAMA_TEMPERATURE = 0.0
OLLAMA_NUM_CTX = 8192
OLLAMA_NUM_PREDICT = 1500
# --- Настройки для генерации темы (Lightweight model) ---
OLLAMA_SUBJECT_URL = "http://172.16.80.47:8080/v1/chat/completions"
OLLAMA_SUBJECT_MODEL = "gemma-4-E4B-it-Q4_K_M"
# =========================================================
# 6. ИИ: RAG И ВЕКТОРНЫЙ ПОИСК (Работа с документами)
# =========================================================
QDRANT_HOST = "localhost"
QDRANT_PORT = 6333
QDRANT_COLLECTION = "sibcem_enterprise_docs"
# --- НАСТРОЙКИ ВНЕШНЕГО EMBEDDING API (Векторизация) ---
EMBEDDING_API_URL = "http://127.0.0.1:8010/embed"
EMBEDDING_MODEL_NAME = "bge-m3"
EMBEDDING_API_TOKEN = os.getenv("EMBEDDING_API_TOKEN", "").strip(' "\'\r\n')
# Пути к ресурсам, формируемые динамически от корня папки бота
SEARCH_DOCS_PATH = os.path.join(BASE_DIR, "enterprise_docs")
LOGS_PATH = os.path.join(BASE_DIR, "search_bot", "logs")
# --- НАСТРОЙКИ РЕРАНКЕРА (Кросс-энкодер для переоценки релевантности) ---
ENABLE_RERANKER = True
RERANKER_MODE = "REMOTE_LLAMACPP"
# Настройки для режима "REMOTE_LLAMACPP"
# ИСПРАВЛЕНО: Добавлен суффикс .gguf для точного роутинга на бэкенде llama-server (порт 8081)
RERANKER_API_URL = "http://172.16.80.47:8081/v1/rerank"
RERANKER_MODEL_NAME = "bge-reranker-v2-m3-Q8_0.gguf"
# Настройки для режима "LOCAL" (в оперативной памяти)
RERANK_MODEL_PATH = "/opt/models/bge-reranker"
# --- НАСТРОЙКИ ФИЛЬТРАЦИИ И ЛИМИТОВ (Поиск) ---
QDRANT_LIMIT = 10
RERANK_TOP_K = 10
MAX_AI_CONTEXTS = 6
MAX_CONTEXT_LENGTH = 15000
MAX_SINGLE_CHUNK_LENGTH = 1500
QDRANT_SCORE_THRESHOLD = 0.45
RERANK_SCORE_THRESHOLD = -3.5
TABLE_SCORE_THRESHOLD = 0.35
QDRANT_CHUNK_WINDOW = 2
QDRANT_SCROLL_LIMIT = 50
# =========================================================
# 7. НАСТРОЙКИ СПРАВОК И ТЕСТИРОВАНИЯ (Личный кабинет)
# =========================================================
DOCUMENTS_TEST_MODE = False
DOCUMENTS_TARGET_EMAIL = "ds.krivochenko@sibcem.ru"
# =========================================================
# 8. ОТЛАДКА И АНАЛИТИКА
# =========================================================
ENABLE_DEEP_PROFILING = True
ENABLE_QDRANT_DEBUG = True
LOG_RAW_CHUNKS = True
DEBUG_TEXT_LIMIT = 250
# =========================================================
# 9. ПОДСИСТЕМА МОНИТОРИНГА И СТАТУСА БОТА (HEARTBEAT)
# =========================================================
ADMIN_CHAT_ID = "744bad93e58c4c498e15468562c6a2da3b610e9c"
ENABLE_HEARTBEAT_MONITOR = True
HEARTBEAT_CHECK_INTERVAL_SEC = 10.0
HEARTBEAT_MAX_FAILURES = 3
# =========================================================
# 10. БЕЗОПАСНОСТЬ И ДВУХФАКТОРНАЯ АВТОРИЗАЦИЯ (2FA / OTP)
# =========================================================
# Срок действия одноразового OTP-кода (180 секунд = 3 минуты)
OTP_TTL_SEC = 180
# Максимальное количество попыток ввода OTP-кода до срабатывания защиты
OTP_MAX_ATTEMPTS = 3
# Время полной аппаратной блокировки меню расчетных листов (1800 секунд = 30 минут)
OTP_BLOCK_DURATION_SEC = 1800
# Глобальный таймаут неактивности пользователя в любом подменю (1800 секунд = 30 минут)
SESSION_TIMEOUT = 1800