- Отвечает только администраторам из 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>
3.7 KiB
3.7 KiB
Boltun AI
Telegram-бот для групповых чатов с AI-личностями. Стек: Node.js, TypeScript, grammY, Mastra (модели через 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) до добавления в группу или сделайте бота админом группы.
Запуск локально
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 — домен и порты не нужны, достаточно одной реплики.
- Создать проект и приложение, источник — этот git-репозиторий, ветка
main. - Build Type —
Dockerfile. - Environment — переменные из таблицы выше.
- Volumes — volume, смонтированный в
/app/data(там SQLite-база, иначе история и личности пропадут при передеплое). - Deploy.