- Бот запоминает участников (имя, фамилия, ник, активность) и ID автора каждого сообщения - Упоминания в вопросе (@ник и по имени-ссылке) передаются модели с данными участника - Новые инструменты агента: list_chat_members, read_member_messages (поиск по нику/имени) - Бот обращается к людям по имени - Промпты вынесены в prompts/system.md и prompts/personas/<id>.md - Личности больше не редактируются из чата: скрипт seed синхронизирует их с БД при старте - Оставлена одна личность boltun (Dirty D) - Миграция старых баз: колонка messages.user_id Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Boltun AI
Telegram-бот для групповых чатов с AI-личностями. Стек: Node.js, TypeScript, grammY, Mastra (модели через OpenRouter / DeepSeek), SQLite.
Возможности
- Отвечает только администраторам из
ADMIN_IDS, остальных молча игнорирует. - Вопросы:
/ask <вопрос>, упоминание@бота, ответ на сообщение бота, в личке — любое сообщение. - Контекст из чата: бот сохраняет сообщения чата в SQLite (последние
HISTORY_LIMITна чат). Попросите «посмотри последние 100 сообщений и перескажи» — агент сам вызовет инструментread_chat_messagesи загрузит переписку в контекст. Если задать/askответом на чьё-то сообщение, оно тоже попадёт в контекст. - Участники: бот запоминает имя, фамилию и ник каждого, кто пишет в чат (и тех, кого упомянули по имени-ссылке). Можно спрашивать «что писал @ivan?», «что думает Иван про выручку?», «кто тут самый активный?» — агент найдёт человека по нику или имени (инструменты
list_chat_members,read_member_messages) и обращается к людям по имени. - Личности: задаются в коде, из чата не редактируются. Сейчас одна —
boltun(Dirty D)./personas— список и выбор кнопками/persona <id>— выбрать
Промпты и личности
prompts/system.md— общие правила бота (формат ответа, инструменты). Читается при старте.prompts/personas/<id>.md— промпт личности; список личностей (id и название) — вsrc/constants/personas.ts.pnpm seedсинхронизирует личности с БД (добавляет, обновляет, удаляет лишние). В Docker seed выполняется при каждом старте контейнера, локально — вpnpm dev.
Поменял промпт — перезапусти бота (или pnpm seed + перезапуск).
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.
Description
Languages
TypeScript
98.9%
Dockerfile
1.1%