Это не очередной «полезный ассистент» для погоды. Это полноценный участник чата с характером, памятью и собственным мнением.
Бот построен на гибридной архитектуре. Он умеет работать через OpenRouter (или любой OpenAI-compatible API), искать информацию в интернете через Tavily, а при проблемах автоматически переключаться на бесплатные ключи Google Gemini.
Каждая проверка источников и готового ответа имеет общий бюджет 40 секунд: основному провайдеру выделяется максимум 18 секунд, резервному остаётся остальное время. Источники проверяются по релевантным фрагментам: до 6000 символов страницы, 1000 символов поисковой выдержки и 32000 символов всего текста материалов на одну проверку. На весь сбор и проверку источников выделено до 90 секунд, включая один повтор технически не завершившейся проверки. Если проверить материалы не удалось, Сыч объясняет сбой и показывает найденные ссылки без неподтверждённых выводов.
Чтобы продолжить разговор, можно ответить на сообщение Сыча или на свой вопрос, на который он уже ответил. Второй вариант действует пять минут и привязан к автору, чату, теме и business connection. Связь появляется только после подтверждённой отправки ответа, очищается при удалении памяти и не распространяется на скрытые команды.
С обновлением Telegram (Bot API 10.1) Сыч шлёт document-grade сообщения: заголовки, списки, таблицы, цитаты, сворачиваемые блоки и спойлеры. Короткие реплики остаются живым текстом, а длинные ответы, статистика, /help и отчёты оформляются красиво. На старых клиентах работает авто-фоллбэк в обычный текст (см. src/utils/rich.js).
Бот больше не привязан жестко к одной нейросети. В конфиге можно указать любой BASE_URL.
- Хотите DeepSeek за копейки? Пожалуйста.
- Есть доступ к Mistral или OpenAI? Легко.
- Хотите поднять Ollama локально? Тоже будет работать.
- По умолчанию настроен на OpenRouter (агрегатор нейросетей).
Для актуальных фактов Сыч ищет источники, читает страницы и проверяет соответствие ответа найденным подтверждениям. Его сарказм, шутки и настройки творческого ответа сохранены. Проверка снижает риск выдумок, но не гарантирует безошибочность модели.
- Провайдеры: Поддержка Tavily (рекомендуется, 1000 бесплатных запросов/мес) или Perplexity (через API).
- Каскадная система: Если Tavily не настроен или упал, бот автоматически переключится на нативный поиск Google.
- Проверка фактов: «Сыч, проверь, это правда?», «Ты уверен?», «Найди первоисточник» учитывают сообщение, на которое ответили. Фактчек приложенного поста не подменяется пересказом. Для правил компаний предпочтительна официальная документация; поддержка страны не означает гарантированную оплату любой картой.
- Подтверждения: вместо готового резюме поисковика — источники и цитаты. До двух поисковых запросов, чтение до трёх страниц на первом шаге и двух на уточняющем; общий бюджет исследования — 60 секунд. Если источник не подтверждает вывод, Сыч сообщает об ограничении. Поисковые выдержки и ответы резервных поисковых моделей считаются сообщениями источников, а не независимо проверенными страницами.
- Проверка ответа: после исследования отдельная проверка ищет потерянные оговорки и неподходящие ссылки. Цитаты сверяются с полученным текстом, соответствие ссылок выводам проверяет модель. Ссылки могут вести на любые сайты, включая Telegram, новости и загрузки; адрес найденного ресурса может отличаться от адреса страницы-источника. Автоматического запрета на URL вне списка источников нет. При отказе проверки бот сообщает, что не может подтвердить вывод, и не публикует промежуточные утверждения модели. При переходе на резервную модель собранные подтверждения сохраняются. Обычные шутки и творческие задачи не запускают исследование и проверку фактов.
- Скорость: проверка фактических ответов добавляет запросы и задержку; при таймаутах Сыч сообщает о неполной проверке. Изображения из поиска подставляются только по явному запросу показать/найти изображение.
Проверки: npm test. Опционально node scripts/test-research-live.js — реальные AI-вызовы, три сценария с настоящим поиском и пять с управляемыми условиями/болтовнёй; без Telegram и production-базы. --case=live-kazakhstan запускает один сценарий; --case=rumor --native проверяет резервный Gemini без OpenRouter. Отчёты содержат входы, ответы и выводы проверки и сохраняются только в игнорируемом test-output/; результаты требуют смысловой оценки, не только проверки регулярными выражениями.
Чтобы не разориться на платных API, бот разделяет задачи между моделями:
- Logic Model (Дешевая):
Gemma-2-9b/Gemma-3-27b. Работает в фоне, анализирует контекст, решает, нужно ли отвечать, ставит реакции. Стоит копейки. - Smart Model (Умная):
Gemini 3.7 Flashчерез OpenRouter. Генерирует финальные ответы и шутки. - Search Model:
Perplexity Sonar(опционально) или Tavily API.
Если у вас закончились деньги на OpenRouter или упал API, бот не отключится. Он автоматически перейдет на резервный канал — нативные ключи Google Gemini (если вы их указали).
- Учет времени: Бот запоминает город пользователя из переписки. Если спросить «Сколько время?», он ответит с учетом вашего часового пояса, зная, что сервер находится в другом месте.
- Репутация: Бот ведет досье на каждого участника (0-100 баллов). Копить доверие сложно (+1..+3 за позитив), а терять легко (-5..-10 за негатив к боту). При этом бот не снижает репутацию, если вы ругаетесь с кем-то другим — только за негатив лично в его адрес.
- Устойчивость распознавания: при временных ошибках Google 500/502/503/504 Сыч повторяет расшифровку до двух раз с паузами 1 и 2 секунды. Временная перегрузка не помечает ключ как исчерпанный. Распознавание, паузы и переключения ключей при ошибках квоты укладываются в общий бюджет 60 секунд; некорректный ответ или неверный формат аудио не запускает повторные попытки.
- Обращение голосом: «Сыч, сколько будет два плюс два?» проходит через обычный диалог с характером, контекстом и поиском. Отдельная карточка расшифровки/саммари не отправляется. Голосовой реплай на ответ Сыча работает без имени; имя в подписи тоже учитывается. Используется тот же
config.triggerRegex, что и для текста. - Голосовые: Нейтральное распознавание на Gemini 2.5 Flash Lite. Если модель перегружена или не отвечает вовремя, запись получает отдельная резервная Gemini 2.5 Flash (
VOICE_FALLBACK_MODEL). Основному пути выделены до 30 секунд, каждому запросу до 15 секунд; весь путь вместе с резервом ограничен 60 секундами. До 700 символов текст показывается свёрнутой цитатой. Для длинного текста основная Gemini 3.7 Flash пишет пересказ с характером Сыча: обычно 2–3 предложения, ориентир 200–320 символов, максимум 360 и не больше половины оригинала. Отдельная проверка по полной расшифровке исправляет неподтверждённые усиления и сокращает слишком длинный черновик; это снижает риск ошибок, но не гарантирует безошибочность модели. Шапки с именем/длительностью и «Кратко:» нет. Полный текст под кнопкой «Расшифровка» открывается одним нажатием. Общий бюджет генерации и проверки составляет 45 секунд (VOICE_SUMMARY_TIMEOUT_SECONDS). При ошибке появляется пояснение и остаётся полная расшифровка; непроверенный черновик не публикуется. Остальные цитаты бота свёрнуты, кроме цитат внутри закрытого раскрываемого блока. - Vision: Понимает, что изображено на картинках.
- Документы: PDF, изображения, аудио и видео анализируются мультимодальной моделью; из DOCX, PPTX и XLSX текст безопасно извлекается локально с защитой от ZIP-бомб.
- YouTube: По явному запросу Сыч сначала получает субтитры ролика и сохраняет временную шкалу. Если YouTube блокирует серверный IP или субтитров нет,
gemini-3.5-flash-liteсмотрит публичное видео напрямую; одинаковые разборы кэшируются на 6 часов. Только если оба способа недоступны, используется поиск Tavily. Обзор, обычный пересказ, подробный и полный разбор получают разные бюджеты, а таймкод ограничивает анализ лишь при явной просьбе «с этого места».
- JSON-файлы записываются атомарно: незавершённая запись не заменит последнюю целую версию.
- При запуске и затем раз в сутки создаётся резервный снимок в
/data/backups; по умолчанию хранится 14 последних копий. - Если основной JSON повреждён, бот автоматически пытается восстановить его из последнего корректного снимка.
- Команда
Сыч, забудь меняудаляет профиль пользователя во всех чатах, связанные напоминания, персональные инструкции, текущий оперативный контекст и соответствующие данные из резервных снимков.
- «Сыч, напомни, сколько дней в неделе?» — обычный ответ сейчас, без таймера. Вопрос «когда у нас завтра созвон?» также не создаёт уведомление.
- «Сыч, напомни завтра в 12 купить молоко» или «Сыч, напомни через час спросить, сколько стоит ремонт» — будущее уведомление.
- Реплай на анонс + «Сыч напомни завтра в 12» берёт тему из анонса. «Напомни об этом» может взять время единственного события из анонса; «напомни за час до начала» вычитает час из времени события. Относительные даты в старом/пересланном анонсе считаются от даты оригинала, а не от сегодняшнего дня.
- Если времени, темы или точности не хватает, бот задаёт вопрос. Ответьте реплаем на этот вопрос, например «завтра в 12» или голосом «в двенадцать». Исходная тема и дата сохраняются. «Отмена» таким же реплаем отменяет только незавершённую просьбу. Уточнение доступно 30 минут, только своему автору в том же чате и теме; перезапуск сбрасывает незавершённые уточнения.
- По умолчанию — Екатеринбург (UTC+5); поддерживаются МСК и явный UTC/GMT offset. Поддерживаются конкретные даты, дни недели, сегодня/завтра/послезавтра, интервалы в минутах/часах/днях/неделях, в том числе числа словами. При непонятном или прошедшем времени бот уточняет; повторяющиеся напоминания пока не поддерживаются.
- Подтверждение содержит фактически сохранённые дату, время, пояс и тему. Уведомление возвращается в исходную тему реплаем на исходное сообщение. Проверка очереди — раз в минуту, поэтому возможна задержка до минуты; при ошибке отправки запись остаётся для следующей попытки.
Локальная проверка: npm test. Проверка настоящей модели: node scripts/test-conversation-live.js. Опциональный режим --telegram отправляет тестовые сообщения только настроенному администратору, использует настоящие модели и Telegram API, подаёт синтетические входящие события в реальный обработчик и пишет отдельную базу/отчёт в test-output/. Он не запускает polling и не проверяет вход через пользовательский Telegram-клиент. Для голосовых нужны OGG-файлы, перечисленные в начале скрипта.
Сыч умеет работать как ассистент в личных переписках Telegram Business: читать доступные чаты и отвечать от имени подключенного бизнес-аккаунта.
- Доступ только владельцу: Business-подключения принимаются только если владелец connection совпадает с
ADMIN_USER_ID. Если кто-то другой подключит этого бота к своему Telegram Business, бот будет игнорировать такие сообщения. - Реакция по вызову: В business-чатах Сыч отвечает только на явный вызов
сыч/sychили реплай на его сообщение, как в группах. - Без спама в логи: Успешные business-сообщения не логируются по одному; в логах остаются ошибки доступа и технические проблемы.
- Кнопки: Inline-кнопки под сообщением можно добавить в будущем. Обычные reply-клавиатуры Telegram не поддерживает для сообщений, отправленных от имени business-аккаунта.
Требуется Node.js 18+.
git clone https://github.com/Veta-one/sych-bot.git
cd sych-bot
npm installСоздайте файл .env в корне. В проекте нет сложной базы данных, всё хранится в JSON-файлах в папке /data.
Минимальный конфиг:
TELEGRAM_BOT_TOKEN=ваш_токен_от_botfather
ADMIN_USER_ID=ваш_id_телеграм
# Основной API (OpenRouter, DeepSeek, Mistral)
AI_API_KEY=sk-or-v1-......
# Поиск (Tavily - бесплатно и быстро)
TAVILY_API_KEY=tvly-......
SEARCH_PROVIDER=tavily
# Резерв (и обработка голосовых)
GOOGLE_GEMINI_API_KEY=AIzaSyD...
# Необязательно: резервные копии
BACKUP_INTERVAL_HOURS=24
BACKUP_RETENTION=14Полный список настроек и примеры подключения к разным API смотрите в файле .env.example.
Чтобы бот отвечал в личных business-переписках:
- В BotFather включите Chat Access Mode для бота.
- В Telegram откройте Настройки → Telegram Business → Автоматизация чатов и подключите бота.
- Дайте боту доступ к нужным чатам и право отвечать. В Bot API это право отображается как
can_reply=true. - Проверьте, что
ADMIN_USER_IDв.envравен Telegram ID владельца business-аккаунта.
Если can_reply=false, бот будет видеть сообщения, но не сможет отправлять ответы.
Локально:
node src/index.jsНа сервере (через PM2):
npm install -g pm2
pm2 start src/index.js --name "sych-bot"
pm2 saveСыч v1.14.2 поддерживает четыре эфемерные команды. Их меню регистрируется только для владельца в каждом известном групповом чате, из публичных меню и справки они убраны. Для скрытой отправки регистрация в персональном меню владельца необходима. Требуется актуальный клиент Telegram; перед отправкой проверь, что клиент показывает скрытый режим.
/ask@Siitch_bot вопросреплаем на сообщение участника: Сыч получает текст и изображение исходного сообщения, а ответ виден только владельцу внутри этой группы. Можно добавить свою картинку с командой в начале подписи, текст и ссылку. Если картинки есть и в запросе, и в исходном сообщении, модель видит обе. Альбомы этим сценарием не поддерживаются./say@Siitch_bot Сыч, оспорь его доводреплаем на обычное сообщение участника: просьба скрыта, Сыч получает исходный текст или изображение и сведения об авторе, затем отвечает в своём стиле публичным реплаем на исходное сообщение. Можно попросить похвалить, раскритиковать или написать другую реплику по контексту. Имя и тег необязательны, форму ответа Сыч выбирает сам. Если прямо попросить «тегни автора», упоминание использует его Telegram ID, даже без username. Без реплая можно задать любую просьбу, а для конкретного упоминания указать@username, например/say@Siitch_bot Похвали @vanya за помощь. Подтверждения и ошибки остаются скрытыми. Частные диалоги, профиль и персональные инструкции владельца не используются для публичной реплики; в общую историю добавляется только опубликованный текст. При муте публикация отменяется. Неоднозначная ошибка отправки не вызывает автоматический повтор: проверь чат, прежде чем просить ещё раз./mute@Siitch_botпереключает публичную активность всего чата, включая темы. Скрытые команды остаются доступны. Напоминания сохраняются и ждут включения; старые муты отдельных тем сохраняются./ban@Siitch_botреплаем на сообщение участника: Сыч перестаёт отвечать, реагировать и обрабатывать его голосовые только в этой группе. Человек остаётся участником Telegram-группы./unban@Siitch_bot IDснимает локальный запрет и прежний глобальный запрет для этого ID.
Для вопроса сначала приходит скрытая карточка «Думаю…», затем она редактируется ответом. Можно продолжить реплаем на этот скрытый ответ; частный контекст связан с конкретной карточкой, чатом, владельцем и темой. Он хранится только в памяти до 30 минут, очищается по «забудь меня» и не добавляется в общую историю или профили. Общий контекст чата читается для понимания вопроса. Приватный сбой не переключает доставку на обычное сообщение в группу.
Эфемерные сообщения могут исчезать со временем или после перезапуска приложения, доставка офлайн-пользователю не гарантируется. Боту без прав администратора нужно отправить первый скрытый ответ в течение 15 секунд; долгий ответ Сыч размещает редактированием начальной карточки. Документация Telegram.
Обычные команды со слешем выполняются только с username этого бота: например, /mute@Siitch_bot. Команды без адреса (/mute) и адресованные другим ботам (/mute@Other_bot) игнорируются, в том числе в личке, в реплаях и подписях к файлам. В подтверждённом скрытом обновлении Telegram команда из меню может прийти без ручного username. Регистр не важен. Для своей установки замените Siitch_bot на её username. Обычные обращения «Сыч, ...» работают как раньше.
- Текст: Просто общайтесь. Бот ответит, если его триггернуть (имя "Сыч") или если он решит, что это уместно.
Сыч напомни [когда] [о чём]— поставит напоминание; информационный вопрос с «напомни» получит обычный ответ.Сыч кто я?— расскажет ваше досье.Сыч расскажи про @юзераилиСыч расскажи про 304648510— покажет досье участника по username или точному Telegram ID в текущем чате.Сыч, забудь меня— полностью удалит персональную память пользователя и его напоминания.Сыч, перескажи https://youtube.com/...— перескажет ролик по субтитрам или посмотрит публичное видео напрямую.- Отправьте с обращением к Сычу PDF, DOCX, PPTX, XLSX, TXT или файл с кодом: он прочитает его и ответит на вопрос. Текстовые файлы преобразуются в текст запроса для любой основной модели, включая Claude Haiku. Поддерживаются UTF-8, UTF-16 и Windows-1251. Большой текст сокращается с охватом начала, середины и конца; Сыч сообщает о сокращении. Бинарный файл под именем TXT будет отклонён.
Досье использует сохранённые слова участника с привязкой к исходному сообщению. Новые сведения берутся из буквальных цитат его собственных сообщений, пересылки и сообщения других участников не становятся его фактами. Старая память сохранена и помечается как неперепроверенная. Готовую характеристику проверяет отдельный нейтральный запрос; если проверка недоступна, Сыч показывает ограниченное досье с цитатами. Это уменьшает выдумки, но не подтверждает правдивость слов участника и не исправляет автоматически старые ошибки памяти.
Сыч кинь монетку— орел/решка./start@Siitch_bot— справка.
/ban@Siitch_bot @username— Забанить пользователя (бот перестанет его видеть)./ban@Siitch_bot— Показать список последних активных (чтобы забанить спамера без юзернейма)./unban@Siitch_bot ID— Разбанить.Сыч стата— Показать подробную статистику расхода токенов по провайдерам (API / Search / Native)./mute@Siitch_bot— Переключить режим тишины в текущей теме.
сыч [вопрос]— вызвать Сыча в личной business-переписке.sych [question]— английский триггер.- Без триггера бот читает доступный контекст, но не отвечает.
Business-режим не превращает бота в публичного ассистента: чужие business-подключения игнорируются, обычные личные сообщения от не-админов по-прежнему получают отказ, а в группах действует проверка присутствия админа.
/src/core— Логика поведения и промпты./src/services— AI, YouTube, документы и надёжное файловое хранилище./data— JSON-базы и автоматически ротируемые снимки в/data/backups.
Я регулярно выкладываю обновления, эксперименты с промптами и новые фичи в канале:
Если проект зашёл и вы хотите угостить автора кофе (или оплатить токены для тестов):
USDT (TRC20): TYgsAvTkkrRqArgo3Q5BYMghbYn6DViVqQ