This commit is contained in:
kandrusyak
2026-07-25 15:07:53 +03:00
commit 6667e0d253
40 changed files with 3258 additions and 0 deletions

141
README.md Normal file
View File

@@ -0,0 +1,141 @@
# KAndrusyak Bot
Telegram-ассистент с двумя режимами AI: локальными Ollama + faster-whisper или
облачными YandexGPT + SpeechKit через Yandex AI Studio,
контекстом текущего диалога,
долговременной памятью, заметками, напоминаниями и отслеживанием статусов.
Вся переписка сохраняется в SQLite отдельно для каждого чата. В текущий контекст попадают
последние реплики активной темы, причем более свежие сообщения имеют больший приоритет.
При явной смене темы модель начинает новый контекст, не удаляя архив. К старому обсуждению
можно вернуться обычной просьбой к боту или найти сообщения командой `/history ключевые слова`.
Команда `/new` вручную начинает новую тему и также сохраняет предыдущую переписку.
## Структура
- `main.py` — совместимая точка входа;
- `assistant_bot/application.py` — сборка Telegram-приложения;
- `assistant_bot/config.py` — переменные окружения и настройки;
- `assistant_bot/storage.py` — SQLite-хранилище;
- `assistant_bot/ollama.py` — HTTP-клиент Ollama;
- `assistant_bot/yandex_ai.py` — адаптер Yandex AI Studio SDK;
- `assistant_bot/agent.py` — агентный цикл и выполнение внутренних tools;
- `assistant_bot/handlers.py` — Telegram-команды и сообщения;
- `assistant_bot/reminders.py` — разбор времени напоминаний;
- `assistant_bot/jobs.py` — фоновые задачи;
- `tests/` — модульные тесты ядра.
## Запуск
```powershell
conda activate kandrusyak_bot
python -m pip install -r requirements.txt
python main.py
```
Также пакет можно запустить командой `python -m assistant_bot`.
Обязательная настройка в `.env`:
```dotenv
BOT_TOKEN=...
ASSISTANT_MODE=local
```
`ASSISTANT_MODE` принимает `local` (значение по умолчанию) или `yandex`.
Общие дополнительные настройки: `ASSISTANT_DB`, `ASSISTANT_TIMEZONE` и
`VOICE_MAX_DURATION_SECONDS`.
### Локальный режим
В режиме `local` текст обрабатывает Ollama, а голосовые сообщения распознаются
локально через faster-whisper. Настройки:
```dotenv
ASSISTANT_MODE=local
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=qwen3.5:9b
```
При первом голосовом сообщении модель faster-whisper будет загружена
автоматически. Настройки распознавания:
```dotenv
WHISPER_MODEL=large-v3
WHISPER_DEVICE=cuda
WHISPER_COMPUTE_TYPE=int8
WHISPER_LANGUAGE=ru
VOICE_MAX_DURATION_SECONDS=120
```
По умолчанию используется полная модель `large-v3` на NVIDIA GPU с вычислениями INT8
и beam size 5. Крупная модель сохраняет приоритет качества, а INT8 уменьшает расход
видеопамяти. Для этого режима необходимы CUDA 12, cuBLAS для CUDA 12 и cuDNN 9.
Чтобы определять язык автоматически, укажите `WHISPER_LANGUAGE=auto`.
На Windows используется зафиксированная версия CTranslate2 4.6.0: более новые
сборки 4.7.x могут аварийно завершаться при инициализации модели. Проект настроен
для Conda-окружения `kandrusyak_bot`. Полный набор DLL cuDNN 9 должен находиться
в системном `PATH` или рядом с библиотекой CTranslate2.
### Режим Yandex AI Studio
В режиме `yandex` бот использует официальный Yandex AI Studio SDK: YandexGPT для
текста и SpeechKit для Telegram-аудио в формате OGG Opus. Создайте API-ключ с
необходимыми ролями и укажите стандартные переменные авторизации SDK:
```dotenv
ASSISTANT_MODE=yandex
YANDEX_CLOUD_FOLDER=...
YC_API_KEY=...
YANDEX_CLOUD_MODEL=yandexgpt/latest
YANDEX_STT_MODEL=general
YANDEX_STT_LANGUAGE=ru-RU
VOICE_MAX_DURATION_SECONDS=120
```
Значения моделей можно посмотреть командой `/models`, а пользовательский выбор
сохранить командой `/model имя-модели`. Выбор хранится отдельно для локального и
облачного режимов. Короткое имя облачной модели автоматически преобразуется в URI
`gpt://<YANDEX_CLOUD_FOLDER>/<YANDEX_CLOUD_MODEL>`.
## Docker
Один `Dockerfile` содержит два независимых target. Облачный Yandex-образ является
target по умолчанию и не содержит CUDA, faster-whisper и CTranslate2:
```bash
docker build --target yandex -t kandrusyak-bot:yandex .
docker run -d \
--name kandrusyak-bot \
--restart unless-stopped \
--env-file .env \
-e ASSISTANT_MODE=yandex \
-v kandrusyak-data:/data \
kandrusyak-bot:yandex
```
Локальный образ содержит CUDA 12, cuDNN 9 и faster-whisper. Для него требуется
NVIDIA Container Toolkit:
```bash
docker build --target local -t kandrusyak-bot:local .
docker run -d \
--name kandrusyak-bot \
--restart unless-stopped \
--gpus all \
--env-file .env \
-e ASSISTANT_MODE=local \
-v kandrusyak-data:/data \
kandrusyak-bot:local
```
Ollama должна быть доступна контейнеру по адресу из `OLLAMA_BASE_URL`; адрес
`localhost` внутри контейнера указывает на сам контейнер, а не на Linux-хост.
## Проверка
```powershell
conda activate kandrusyak_bot
python -m unittest discover -v
```