Files
boltun-ai/README.md
yunogasai 99c4660da9 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>
2026-09-24 18:31:44 +02:00

49 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.