Files
umb/README.md
T

9.1 KiB
Raw Blame History

🤖 UMB — Telegram Bot

Универсальный бот-модератор с AI-ассистентом "Астра"

License: MIT Python 3.11 aiogram 3.x SQLite Docker Tests SOCKS5 Proxy


UMB — это Telegram-бот для модерации стикеров/GIF, восстановления раскладки, получения погоды и общения с AI-ассистентом Астра.

Функции

  • 🛡️ Модерация стикеров и GIF — если пользователь отправляет 25+ стикеров/GIF за 60 секунд, бот удаляет все последующие стикеры и GIF от этого пользователя в течение 5 минут. Текстовые сообщения не затрагиваются.
  • ⌨️ Восстановление раскладки (/res) — ответьте командой /res на сообщение с текстом в неправильной раскладке, и бот переведёт его (например, gbdjпиво).
  • 🌤️ Погода (/weather) — покажет подробную погоду в указанном городе через OpenWeatherMap API.
  • 🤖 AI-ассистент "Астра" (/ai) — задайте вопрос, ответьте командой /ai на сообщение или перешлите сообщение, и Astra проанализирует его с учётом контекста и ранее сохранённых выжимок диалогов.
  • 💬 Диалог с Астрой — после /ai без вопроса начинается диалог. Отвечайте на сообщения бота, чтобы продолжать.
    • Фаза 1: до 50 сообщений.
    • Фаза 2: дополнительно до 20 сообщений.
    • После исчерпания лимита — перерыв 1 час.
  • 🔒 Управление AI (/aino, /aiyes) — владелец чата может заблокировать/разблокировать пользователя от AI.
  • 🧦 Поддержка SOCKS5 прокси — настраивается через .env.

🏗️ Структура проекта

umb/
├── .env                      # настройки: токен, прокси, API ключи
├── .gitignore
├── requirements.txt
├── main.py                   # точка входа
├── config.py                 # конфигурация
├── Dockerfile
├── docker-compose.yml
└── bot/
    ├── __init__.py
    ├── bot.py                # инициализация бота и сессии
    ├── setup_commands.py     # меню команд
    ├── routers/
    │   ├── __init__.py
    │   ├── moderation.py     # роутер модерации стикеров/GIF
    │   ├── layout.py         # роутер /start, /res
    │   ├── weather.py        # роутер /weather
    │   ├── ai.py             # роутер /ai, /aino, /aiyes, /aiclear, /aiuser
    │   ├── dialogue.py       # диалоговый режим с Астрой
    │   ├── voice.py          # распознавание голосовых сообщений
    │   └── yadisk.py         # скачивание с Яндекс.Диска
    └── utils/
        ├── __init__.py
        ├── proxy.py             # общий SOCKS5-коннектор
        ├── layout_converter.py  # конвертер раскладки en→ru
        ├── weather.py           # функция получения погоды
        ├── ai_client.py         # OpenRouter/RouterAI клиент
        ├── memory.py            # саммари и эмбеддинги
        ├── database.py          # SQLAlchemy модели и функции БД
        ├── voice.py             # загрузка и транскрибация голоса
        ├── yadisk_download.py   # загрузка файлов с Яндекс.Диска
        ├── s3_client.py         # загрузка больших файлов в S3
        └── logging_config.py    # настройка логирования

🚀 Установка

cd umb
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

⚙️ Настройка

Откройте .env и укажите необходимые ключи:

BOT_TOKEN=your_bot_token_here
PROXY_ENABLED=false
PROXY_URL=socks5://user:pass@host:port
API_WEATHER=your_openweather_api_key
OPENROUTER_API_KEY=your_openrouter_api_key
ROUTERAI_API_KEY=your_routerai_api_key
ROUTERAI_BASE_URL=https://routerai.ru/api/v1

# Опционально: периодическая проверка работоспособности бесплатных моделей.
# Внимание: проверка расходует токены API. По умолчанию отключена.
AI_HEALTH_CHECK_ENABLED=false
AI_HEALTH_CHECK_INTERVAL=600

Для включения прокси установите PROXY_ENABLED=true и укажите корректный PROXY_URL.

▶️ Запуск

source .venv/bin/activate
python main.py

🐳 Запуск в Docker

docker compose up -d --build

Модели Whisper сохраняются в ./models, база данных и логи — в ./bot/data.

🧪 Тесты

source .venv/bin/activate
pytest tests/ -v

📋 Команды

Команда Описание
/start Приветствие и информация о боте
/res Восстановить раскладку (ответить на сообщение)
/weather <город> Погода в указанном городе
/ai <вопрос> Задать вопрос Астре
/ai (ответом/пересылкой) Проанализировать сообщение
/ai (без вопроса) Начать диалоговый режим
/aiclear Очистить диалог и сохранить выжимку
/aiuser Список пользователей чата (только creator)
/aino @username Заблокировать пользователя от AI (только creator, 24ч)
/aiyes @username Разблокировать пользователя от AI (только creator)
/ydf <ссылка> Скачать файл с Яндекс.Диска
/ydf (new) <ссылка> Скачать файл, игнорируя кеш Telegram

⚖️ Настройки модерации

Изменяются в config.py:

  • MODERATION_LIMIT = 25 — количество стикеров/GIF за окно
  • MODERATION_WINDOW = 60 — окно подсчёта в секундах
  • MODERATION_BAN_DURATION = 300 — длительность бана в секундах

🧠 AI-ассистент "Астра"

  • Бесплатные модели (OpenRouter): пробует по очереди доступные модели с суффиксом :free. При rate-limit автоматически переключается на следующую.
  • Платный fallback (RouterAI): если все бесплатные модели недоступны, используется deepseek/deepseek-v4-flash через routerai.ru. В ответе добавляется уведомление ⚡ Обработано через платный API.
  • Контекст: хранит последние 10 сообщений каждого пользователя в SQLite.
  • Долгосрочная память: при переходе между фазами диалога и при /aiclear создаётся краткая выжимка, которая затем подбирается по смыслу к новым вопросам.
  • Стиль: отвечает кратко и по делу, если не просят развёрнуто.
  • Потеря контекста: говорит что-то милое ("я потеряла мысль", "смотри, какая птичка!")

Сделано с помощью aiogram · SQLAlchemy · faster-whisper