Telegram-бот Boltun AI на grammY + Mastra
- Отвечает только администраторам из ADMIN_IDS - Личности на чат: встроенные и пользовательские (/personas, /persona, /persona_add, /persona_del) - Вопросы через /ask, упоминание, ответ боту или личку - Сохраняет сообщения чата в SQLite; агент по просьбе читает их инструментом read_chat_messages - Модели через OpenRouter (по умолчанию DeepSeek) - Слои: libs, repositories, services, bot/handlers - Dockerfile для деплоя в Dokploy Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
48
README.md
Normal file
48
README.md
Normal file
@@ -0,0 +1,48 @@
|
||||
# Boltun AI
|
||||
|
||||
Telegram-бот для групповых чатов с AI-личностями. Стек: Node.js, TypeScript, [grammY](https://grammy.dev), [Mastra](https://mastra.ai) (модели через OpenRouter / DeepSeek), SQLite.
|
||||
|
||||
## Возможности
|
||||
|
||||
- Отвечает **только администраторам** из `ADMIN_IDS`, остальных молча игнорирует.
|
||||
- **Вопросы**: `/ask <вопрос>`, упоминание `@бота`, ответ на сообщение бота, в личке — любое сообщение.
|
||||
- **Контекст из чата**: бот сохраняет сообщения чата в SQLite (последние `HISTORY_LIMIT` на чат). Попросите «посмотри последние 100 сообщений и перескажи» — агент сам вызовет инструмент `read_chat_messages` и загрузит переписку в контекст. Если задать `/ask` ответом на чьё-то сообщение, оно тоже попадёт в контекст.
|
||||
- **Личности**: у каждого чата своя активная личность. Встроенные: Болтун, Эксперт, Философ, Саркастик, Пират.
|
||||
- `/personas` — список и выбор кнопками
|
||||
- `/persona <id>` — выбрать
|
||||
- `/persona_add <id> <описание характера>` — добавить/изменить свою
|
||||
- `/persona_del <id>` — удалить свою
|
||||
|
||||
> Telegram Bot API не отдаёт историю чата задним числом: бот видит только сообщения, пришедшие после его добавления. Чтобы он видел все сообщения группы, отключите privacy mode в @BotFather (`/setprivacy` → Disable) **до** добавления в группу или сделайте бота админом группы.
|
||||
|
||||
## Запуск локально
|
||||
|
||||
```bash
|
||||
nvm use # Node 24
|
||||
pnpm install
|
||||
cp .env.example .env # заполнить BOT_TOKEN, ADMIN_IDS, OPENROUTER_API_KEY
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
Свой Telegram ID можно узнать, написав боту `/whoami` в личку.
|
||||
|
||||
## Переменные окружения
|
||||
|
||||
| Переменная | Обязательна | Описание |
|
||||
| --- | --- | --- |
|
||||
| `BOT_TOKEN` | да | токен от @BotFather |
|
||||
| `ADMIN_IDS` | да | Telegram ID админов через запятую |
|
||||
| `OPENROUTER_API_KEY` | да* | ключ OpenRouter (*или ключ того провайдера, что в `AI_MODEL`) |
|
||||
| `AI_MODEL` | нет | модель Mastra model router, по умолчанию `openrouter/deepseek/deepseek-v4-flash`; напрямую через DeepSeek — `deepseek/deepseek-chat` + `DEEPSEEK_API_KEY` |
|
||||
| `DB_PATH` | нет | путь к SQLite, по умолчанию `data/bot.db` (в Docker — `/app/data/bot.db`) |
|
||||
| `HISTORY_LIMIT` | нет | сколько сообщений на чат хранить, по умолчанию 2000 |
|
||||
|
||||
## Деплой (Dokploy)
|
||||
|
||||
Приложение собирается из `Dockerfile` (Build Type: Dockerfile). Бот работает через long polling — домен и порты не нужны, достаточно одной реплики.
|
||||
|
||||
1. Создать проект и приложение, источник — этот git-репозиторий, ветка `main`.
|
||||
2. Build Type — `Dockerfile`.
|
||||
3. Environment — переменные из таблицы выше.
|
||||
4. Volumes — volume, смонтированный в `/app/data` (там SQLite-база, иначе история и личности пропадут при передеплое).
|
||||
5. Deploy.
|
||||
Reference in New Issue
Block a user