- Одна formatUtc и один displayName(profile) вместо копий в разных слоях
- commandOf/mentionsUser/textWithoutMention работают по entities для текста и подписей;
убраны askInCaption, regex-поиск упоминаний и отдельный composer.command("ask")
- Фото скачиваются только если модель их видит; пустой вопрос с картинкой формулирует промпт
- Поддержка фото задаётся явно для моделей по умолчанию, для своей AI_MODEL — через AI_IMAGE_INPUT
- Активность участников считается по сохранённой истории, а не отдельными счётчиками;
один хендлер для message и edited_message, упоминания не пишутся дважды
- SQLite: synchronous = NORMAL для WAL
- Кнопки не-админов отклоняются через bot.drop(isAdmin)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
22 lines
1.2 KiB
Plaintext
22 lines
1.2 KiB
Plaintext
# Токен бота от @BotFather
|
|
BOT_TOKEN=
|
|
|
|
# Telegram ID администраторов через запятую (узнать свой: написать боту /whoami в личку)
|
|
ADMIN_IDS=
|
|
|
|
# Провайдер модели — задай ключ хотя бы одного.
|
|
# OpenRouter: по умолчанию openrouter/google/gemini-3.8-flash — умеет смотреть фото.
|
|
OPENROUTER_API_KEY=
|
|
# DeepSeek напрямую: по умолчанию deepseek/deepseek-flash (только текст), если ключа OpenRouter нет.
|
|
# DEEPSEEK_API_KEY=
|
|
|
|
# Необязательно: конкретная модель в формате Mastra model router <провайдер>/<модель>,
|
|
# например deepseek/deepseek-v4-pro или openrouter/google/gemini-3.8-flash
|
|
# AI_MODEL=
|
|
# Необязательно: умеет ли модель смотреть фото. Для своей AI_MODEL по умолчанию false — включи, если модель видит картинки
|
|
# AI_IMAGE_INPUT=true
|
|
|
|
# Путь к SQLite-базе и сколько сообщений на чат хранить
|
|
DB_PATH=data/bot.db
|
|
HISTORY_LIMIT=2000
|